Сценарий предварительной аутентификации Grails

Я пытаюсь настроить приложение Grails в сценарий с предварительной аутентификацией с использованием Spring Security Core.

Поэтому я написал собственный фильтр аутентификации:

class MyAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
    protected getPreAuthenticatedPrincipal(request) { "my_username" }
    protected getPreAuthenticatedCredentials(request) { "N/A" }
}

добавил его в Spring:

beans = {
    myAuthenticationFilter(MyAuthenticationFilter) {
        authenticationManager = ref('authenticationManager')
        checkForPrincipalChanges = true
    }
}

и зарегистрировал его в BootStrap с позицией PRE_AUTH_FILTER:

class BootStrap {
    def init = { servletContext ->
        SpringSecurityUtils.clientRegisterFilter('myAuthenticationFilter',
            SecurityFilterPosition.PRE_AUTH_FILTER.order)
    }
}

Config.groovy содержит только стандартные имена классов User, Role и UserRole, а также некоторые статические правила.

Внутри фильтра я пытался вернуть всевозможные вещи из его метода getPreAuthenticatedPrincipal(): идентификатор пользователя, идентификатор пользователя в виде строки, его имя пользователя, сам объект пользователя… Я вижу, что мой фильтр вызывается для каждого запроса (который что я хочу, установив checkForPrincipalChanges = true) что бы я из него ни возвращал, текущий пользователь остается анонимным: springSecurityService.principal все равно __grails.anonymous.user__

Что мне нужно изменить в моей настройке, чтобы иметь возможность аутентифицировать моих пользователей с их существующими группами и ролями? Я не хочу писать дополнительный провайдер аутентификации, меня устраивает стандартный daoAuthenticationProvider Grails. Нужно ли мне возвращать что-то конкретное из моего фильтра? Нужно ли мне настраивать другие классы Spring?


person Tobia    schedule 17.09.2014    source источник


Ответы (1)


Я решил это. Я документирую это здесь на случай, если кому-то еще понадобится сделать то же самое.

По сути, отсутствующим элементом была настройка нового PreAuthenticatedAuthenticationProvider в качестве единственного поставщика. Дополнительный код не требуется, просто определите его в ресурсах:

myAuthenticationProvider(PreAuthenticatedAuthenticationProvider) {
    preAuthenticatedUserDetailsService = ref('authenticationUserDetailsService')
}

и установите его как единственного провайдера в Config:

grails.plugin.pringsecurity.providerNames = ['myAuthenticationProvider']

Затем из фильтра проверки подлинности просто верните имя пользователя, прошедшего предварительную проверку подлинности, или null, если нет (анонимный пользователь).

person Tobia    schedule 25.09.2014