Я пытаюсь защитить свое приложение Grails с помощью Spring Security на основе preAuth от Siteminder. Это в основном все, что мне нужно. Приложение используется только для проверки некоторых вещей, поэтому база данных не нужна.
Я застрял на некоторых проблемах с фильтрами, которые почему-то не могу понять.
Сначала я использовал только RequestHeaderAuthenticationFilter и пользовательские UserDetails и UserDetailsService.
Мои Spring bean-компоненты:
beans = {
userDetailsService(MyUserDetailsService)
userDetailsServiceWrapper(UserDetailsByNameServiceWrapper) {
userDetailsService = ref('userDetailsService')
}
preauthAuthProvider(PreAuthenticatedAuthenticationProvider) {
preAuthenticatedUserDetailsService = ref('userDetailsServiceWrapper')
}
requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter){
principalRequestHeader='SM_USER'
authenticationManager = ref('authenticationManager')
}
}
У меня есть MyUserDetailsProvider:
class MyUserDetailsService implements GrailsUserDetailsService {
MyUserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
//some super secret code here ;)
return new MyUserDetails(some needed params)
}
}
Я также настроил защищенные URL-адреса, как в каждом мудром руководстве:
grails.plugins.springsecurity.interceptUrlMap = [
'/user/**':['ROLE_MINE'],
'/activation/**':['ROLE_SOMEOTHER, ROLE_MINE'],
'/js/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/css/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/*': ['IS_AUTHENTICATED_ANONYMOUSLY']
]
и некоторые провайдеры (оставили анонимными, как советовали в каком-то руководстве):
grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider']
Это отлично работало для доступ к данным, но он не позволял загружать ресурсы, в частности изображения. Ошибка говорила о том, что заголовок SM _USER не найден в запросе.
Поэтому я подумал, что могу использовать какое-то решение, такое как «фильтры :нет» или «безопасность :нет», чтобы Spring знал, какой запрос URL разрешается без проверки SM _ПОЛЬЗОВАТЕЛЬ.
Я пробовал добавлять что-то в filter и filterChain :
grails.plugins.springsecurity.filterNames = ['requestHeaderAuthenticationFilter']
grails.plugins.springsecurity.filterChain.chainMap = [
'/user/**': 'requestHeaderAuthenticationFilter',
'/activation/**': 'requestHeaderAuthenticationFilter',
'/*': 'requestHeaderAuthenticationFilter'
]
, но это не помогло.
Затем я попытался использовать какой-то другой фильтр для ресурсов без заголовка SM _USER. Из ссылки я понял, что Анонимного фильтра может быть достаточно.
Итак, я внес некоторые изменения,:
grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider']
grails.plugins.springsecurity.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter']
grails.plugins.springsecurity.filterChain.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter'
]
grails.plugins.springsecurity.filterChain.chainMap = [
'/user/**': 'requestHeaderAuthenticationFilter',
'/versionone/**': 'requestHeaderAuthenticationFilter',
'/activation/**': 'requestHeaderAuthenticationFilter',
'/js/**': 'anonymousAuthenticationFilter',
'/css/**': 'anonymousAuthenticationFilter',
'/images/**': 'anonymousAuthenticationFilter',
'/*': 'requestHeaderAuthenticationFilter'
]
УРА, которые помогли с изображениями. Но начала возникать другая проблема.
Вместо объекта myUserDetails, который должен быть возвращен, когда аутентификация верна, я довольно часто получаю некоторый объект String. И мое приложение дает сбой из-за невозможности найти одно свойство в этом объекте String (, что совершенно очевидно, поскольку его там нет;))
Кто-нибудь знает, как решить эту проблему? Отказаться от показа изображений нельзя;)
Есть ли способ исключить изображения/другие ресурсы из цепочки фильтров в конфигурации безопасности grails spring...? Точно так же, как это было сделано в обычном формате Java.xml...?
Буду признателен за помощь и предложения по решению этой проблемы.
Спасибо!!!
//РЕДАКТИРОВАТЬ :, если кто-то использует это как ссылку для настройки безопасности для siteminder sso, обратите внимание на добавление свойств:
checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'
в ваш requestHeaderAuthenticationFilter. В противном случае вы будете иметь дело с не обновленными полномочиями в сеансе http при вызове springSecurityService.getPrincipal (), поэтому пользователи могут «войти в систему как кто-то другой». :)Также рассмотрите возможность изменения области действия bean-компонентов на «прототип».