Использование Spring Security в пакете JAX-RS в Karaf

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

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


    
    
    
    

    
        
            
        
    

    

    
        
        
    

    
        
            
                
                
            
        
    

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


    
        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        springSecurityFilterChain
        /*
    

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

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

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

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

ОБНОВЛЕНИЕ: После нескольких дополнительных поисков в Google я нашел сообщение на форуме , в котором упоминалось о добавлении Web-FilterMappings: springSecurityFilterChain; url-patterns: = "/ *" в ваш манифест вместо использования web.xml. Однако по-прежнему кажется, что вам нужно использовать WAB вместо обычного пакета. Я добавил строку в свой манифест на всякий случай, но это не действует. Похоже, мой вопрос превращается в: Как мне использовать WAB с CXF?

ОБНОВЛЕНИЕ 2: Поскольку этот вопрос недостаточно длинный ... Я решил попробовать использовать аннотации Spring Security вместо 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-аутентификация работала?

22
задан tronda 16 March 2012 в 13:42
поделиться