Grails, Spring Security и Siteminder - проблемы с ресурсами или пользовательскими деталями
Я пытаюсь обезопасить свое приложение Grails с помощью Spring Spring на основе preAuth от Siteminder. Это в основном все, что мне нужно. Приложение используется только для проверки некоторых вещей, поэтому нет необходимости в базе данных.
Я застрял на некоторых проблемах с фильтром, которые я почему-то не могу охватить.
Сначала я использовал только RequestHeaderAuthenticationFilter и пользовательские UserDetails и UserDetailsService.
Мои весенние бобы:
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_USER.
Я попытался добавить материал для 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'
]
YAY, который помог для изображений. Но другая проблема начала возникать.
Вместо объекта myUserDetails, который должен быть возвращен при правильной аутентификации, я получаю некоторый объект String довольно часто. И моему приложению не удается найти одно свойство в этом объекте String (что вполне очевидно, поскольку его там нет;))
Кто-нибудь знает, как бороться с этой проблемой? Отказ от показа изображений не вариант;)
Есть ли какой-нибудь способ исключить изображения / другие ресурсы из цепочки фильтров в конфигурации безопасности Spring Grails...? Так же, как это было сделано обычным способом Java .xml...?
Буду признателен за любую помощь и предложения, как решить эту проблему.
Спасибо!!!
// РЕДАКТИРОВАТЬ: если кто-то случайно использует это как ссылку для настройки безопасности для siteminder sso, пожалуйста, добавьте:
checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'
свойства для вашего requestHeaderAuthenticationFilter. В противном случае вы будете иметь дело с не обновленными полномочиями в сеансе http при вызове springSecurityService.getPrincipal(), поэтому пользователи могут быть "зарегистрированы как кто-то другой".:) Также рассмотрите возможность изменения области действия ваших bean-компонентов на "прототип".
1 ответ
Если кому-то интересно - я нашел несколько способов решения этой проблемы:
1. Попросите администратора SiteMinder добавить заголовок SM_USER ко всем изображениям или к какому-либо набору, ограниченному местоположением URL-адреса. Это отключено по умолчанию из-за общей производительности. Затем потерять все дополнительные фильтры и жить долго и счастливо с preAuth.
2. Используйте статический контент вместо включения изображений в.war и перенаправления:]
КАК:
Поместите все необходимые изображения в var/www/yourfolder/images. Добавьте псевдонимы в конфигурацию httpd:
Alias /yourapp/imgs var/www/yourfolder/images
ProxyPass /yourapp/imgs !
Перезапустите свой сервис Будьте счастливы, используя изображения:D
Я знаю, что это не решение, а только обходной путь. Все же это работает. Я буду все еще рад услышать некоторые лучшие идеи:)
Приветствия.