我正在尝试使用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类?
答案 0 :(得分:2)
我解决了。我在这里记录它,以防其他人需要这样做。
基本上缺少的是将新的PreAuthenticatedAuthenticationProvider配置为唯一的提供者。无需其他代码,只需在资源中定义:
myAuthenticationProvider(PreAuthenticatedAuthenticationProvider) {
preAuthenticatedUserDetailsService = ref('authenticationUserDetailsService')
}
并将其设置为Config中唯一的提供程序:
grails.plugin.pringsecurity.providerNames = ['myAuthenticationProvider']
然后,从身份验证过滤器中,只返回预先认证用户的用户名,如果没有,则返回null(匿名用户。)