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

Я знаю, что это не решение, а только обходной путь. Все же это работает. Я буду все еще рад услышать некоторые лучшие идеи:)

Приветствия.

Другие вопросы по тегам