У меня есть пакет 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 Security.Я предполагаю, что проблема в том, что пакет должен быть WAR или WAB для загрузки web.xml.Это правильно?
И что более важно, есть ли способ заставить работать пружину без web.xml?
Я работаю в предположении, что мне нужно сохранить пакет в качестве пакета для загрузки CXF, поэтому я не могу преобразовать его в WAR или WAB, но я не совсем уверен, что этодело.
Спасибо за любую помощь, которую вы можете оказать!
ОБНОВЛЕНИЕ: После нескольких дополнительных поисков я нашел сообщение на форуме там упоминалось добавление Web-FilterMappings: springSecurityFilterChain;url-patterns:="/*"
к вашему манифесту вместо использования web.xml.Тем не менее, кажется, что вам нужно использовать WAB вместо обычного комплекта.Я добавил строку в свой манифест на всякий случай, но это не имеет никакого эффекта.Похоже, что мой вопрос превращается в: Как мне использовать WAB с CXF?
ОБНОВЛЕНИЕ 2: Поскольку этот вопрос не достаточно длинный ... Я решил попробовать использоватьАннотации Spring Security вместо 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]
На весеннем веб-сайте говорится, что это происходит при первой попытке анонимного подключения к защищенному сервису, и это не произойдетвторой раз.Ну, это происходит каждый раз для меня.Из исключения, похоже, что моя запись в манифесте подобрана, и, возможно, проблема в другом, чем я думал.У кого-нибудь есть мысли о том, почему это происходит?Я пропускаю какую-то запись в файле beans.xml, чтобы заставить работать базовую http-аутентификацию?