Grails 预验证场景

标签 grails spring-security pre-authentication

我正在尝试在 pre-authenticated scenario 中配置 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() 方法返回各种内容:用户 ID、字符串形式的用户 ID、用户名、User 对象本身……我可以看到我的过滤器正在为每个请求调用(这就是我想要的,设置了 checkForPrincipalChanges = true),无论我从中返回什么,当前用户都保持匿名:springSecurityService.principal 仍然是 __grails.anonymous.user__

我需要在设置中进行哪些更改才能使用用户的现有组和角色对他们进行身份验证?我不想编写额外的身份验证提供程序,我对 Grails 的标准 daoAuthenticationProvider 很满意。我需要从过滤器中返回特定的内容吗?我需要设置一些其他 Spring 类吗?

最佳答案

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

基本上,缺少的部分是将新的 PreAuthenticatedAuthenticationProvider 配置为唯一的提供程序。不需要额外的代码,只需在资源中定义它:

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

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

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

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

关于Grails 预验证场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897039/

相关文章:

Spring Security 不返回 UserDetails 对象,只返回用户名

java - Spring Security HeaderPreAuthentication Principal 未从 @AuthenticationPrincipal 解析

grails - 更新 Grails 项目中的 Gradle

grails - Grails GORM通过Domain映射内的值查找

jquery - Grails/jQuery-将JSON对象从Controller渲染到jQuery函数

spring - Grails Spring 安全 LDAP

grails - 让stagemonitor使用Grails 2.5?

spring-security - springSecurityService.principal 在 tomcat 8.5 中作为 WAR 部署时返回 Null

jakarta-ee - 如何在@Preauthorize 中使用路径变量

spring-security - 使用 Spring Security 的预认证/单点登录