Grails, Spring Security и Siteminder -проблемы с ресурсами или сведениями о пользователе

Я пытаюсь защитить свое приложение 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-компонентов на «прототип».

8
задан Dz. 10 May 2012 в 11:08
поделиться