Подтвердить что ты не робот

Использование Spring Безопасность на комплекте JAX-RS в Карафе

У меня есть пакет OSGi, который использует JAX-RS для обработки некоторых служб REST. Этот пакет запущен в Karaf с Apache CXF. Мне нужно применить базовую HTTP-аутентификацию к определенным комбинациям путей и методов. Я переделывал с помощью Spring Security, и похоже, что новая версия 3.1 позволяет вам делать именно это, однако у меня возникли проблемы с работой в OSGi.

Как тест, я создал очень простой файл beans.xml:

<beans>
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/>
    <import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml"/>

    <jaxrs:server id="serverTest" address="/test">
        <jaxrs:serviceBeans>
            <ref bean="tstSvr"/>
        </jaxrs:serviceBeans>
    </jaxrs:server>

    <bean id="tstSvr" class="com.demo.Test"/>

    <security:http auto-config="true">
        <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" method="PUT" />
        <security:intercept-url pattern="/**" access="ROLE_USER" />
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="user" password="pass" authorities="ROLE_USER"/>
                <security:user name="admin" password="pass" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>

Теперь вот забавная часть... Из всего чтения, которое я делал, мне нужен web.xml для любого из них. Например, этот образец, который я пытался использовать:

<web-app>
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Использование комбинации этих двух файлов не помогло. И "не работает", я имею в виду, что ничего не произошло. Нет сообщений об ошибках, никаких исключений, пакет функционировал, как прежде, чем я попытался добавить Spring безопасность. Я предполагаю, что проблема в том, что пакет должен быть WAR или WAB для загрузки web.xml. Правильно ли это?

И что еще более важно, есть ли способ получить Spring работу без web.xml?

Я работаю над предположением, что мне нужно держать пакет как комплект для CXF, чтобы загрузить его, поэтому я не могу преобразовать его в WAR или WAB, но я не совсем уверен в этом.

Спасибо за любую помощь, которую вы можете предоставить!

UPDATE: Сделав кучу дополнительных поисковых запросов, я нашел сообщение , в котором упоминалось добавление Web-FilterMappings: springSecurityFilterChain;url-patterns:="/*" к вашему манифесту вместо использования web.xml. Тем не менее, по-прежнему кажется, что вам нужно использовать WAB вместо обычного пакета. Я добавил строку к моему манифесту на случай, но это не имеет никакого эффекта. Похоже, что мой вопрос заключается в следующем: как использовать WAB с CXF?

ОБНОВЛЕНИЕ 2: Поскольку этот вопрос не достаточно длинный... Я решил попытаться использовать Spring аннотации безопасности вместо intercept-url, чтобы посмотреть, что произойдет. Когда я пытаюсь попасть в защищенный путь, я получаю эту забавную трассировку стека:

Caused by: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:323)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:196)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[46:org.springframework.aop:3.0.5.RELEASE]

Сайт Spring говорит, что это происходит в первый раз, когда вы пытаетесь анонимно подключиться к защищенной службе, и это произойдет не во второй раз. Ну, это случается каждый раз для меня. Из-за исключения, похоже, что моя запись в манифесте подбирается, и, возможно, проблема отличается от того, что я думал. У кого-нибудь есть мысли о том, почему это происходит? Я пропустил какую-либо запись в beans.xml, чтобы сделать базовую работу http-auth?

4b9b3361

Ответ 1

Прежде всего вам нужно четкое понимание того, что делают spring и web.xml.

  • Web.xml - это стандартный файл для настройки вашего контейнера сервлета, который обычно является сервером приложений, например Jboss, Glassifsh, Jetty, Tomcat...
  • Ваш beans.xml - это файл конфигурации для контекста приложения spring, поскольку, поскольку вы не используете какое-либо пространство имён, это означает, что Karaf использует spring oob.

Если вы хотите использовать Http с помощью сервлетов, без контейнера, я думаю, вам нужно зарегистрировать HttpService, см. http://karaf.apache.org/manual/latest-2.2.x/users-guide/http.html

Ваше исключение происходит, потому что, когда он достигает сопоставленного метода, в SecurityContext отсутствует аутентификация bean. Вы не определили какой-либо анонимный доступ в своих сопоставлениях, возможно, почему он не работает.

В принципе, либо определите AnonymousAuthenticationFilter, либо шаблон URL с разрешениемAll в вашем http config. В противном случае вы будете получать это исключение, первый раз, когда вы попытаетесь подключиться к той же сессии анонимно.