我正在尝试在 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/