Grails预先验证的场景

时间:2014-09-17 17:42:34

标签: grails spring-security pre-authentication

我正在尝试使用Spring Security Core在pre-authenticated scenario中配置Grails应用。

所以我写了一个自定义身份验证过滤器:

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类名,加上一些staticRules。

在过滤器中,我尝试从其getPreAuthenticatedPrincipal()方法返回各种内容:用户ID,用户ID作为字符串,用户名,User对象本身......我可以看到我的过滤器正在调用每个请求(这是我想要的,设置checkForPrincipalChanges = true)无论我从中返回什么,当前用户仍然是匿名的:springSecurityService.principal仍然是__grails.anonymous.user__

我需要更改我的设置,以便能够使用现有的组和角色对我的用户进行身份验证?我不想写一个额外的身份验证提供程序,我对Grails的标准daoAuthenticationProvider没问题。我是否需要从过滤器中返回特定内容?我是否需要设置其他一些Spring类?

1 个答案:

答案 0 :(得分:2)

我解决了。我在这里记录它,以防其他人需要这样做。

基本上缺少的是将新的PreAuthenticatedAuthenticationProvider配置为唯一的提供者。无需其他代码,只需在资源中定义:

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

并将其设置为Config中唯一的提供程序:

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

然后,从身份验证过滤器中,只返回预先认证用户的用户名,如果没有,则返回null(匿名用户。)