我是Spring安全新手,并且正在使用grails应用程序连接到外部身份验证和会话管理服务以进行身份验证/授权。所以我所做的是创建自定义身份验证过滤器
class TokenAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
//in here i call an external service, passing in the a cookie from the request,
//and get username and role information from the service
//not sure what to do with user roles
return username
}
}
然后我查看了超类AbstractPreAuthenticatedProcessingFilter代码,在它的doFilter()方法中,它创建了一个PreAuthenticatedAuthenticationToken(new PreAuthenticatedAuthenticationToken(principal,credentials);)进行身份验证,但它只需要用户名和凭证,而不是角色信息。然后我尝试将不同的详细信息源J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource注入过滤器,因为看起来对我(我可能是错的)这个细节源会通过调用setDetails()将角色信息传递给认证对象。但J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource正在从http请求对象中读取角色信息。
protected Collection<String> getUserRoles(HttpServletRequest request) {
ArrayList<String> j2eeUserRolesList = new ArrayList<String>();
for (String role : j2eeMappableRoles) {
if (request.isUserInRole(role)) {
j2eeUserRolesList.add(role);
}
}
return j2eeUserRolesList;
}
我对身份验证的生命周期感到困惑。我认为http请求对象通过安全上下文中的身份验证对象获取角色信息,此时尚未创建。我需要角色信息才能创建身份验证对象。这不是在循环中运行吗?或者我误解了什么?
我知道我可以使用另一种方法来使我的应用程序工作,只需创建我自己的过滤器来创建身份验证对象(它接受角色参数)而不是让超类(AbstractPreAuthenticatedProcessingFilter)来创建身份验证对象,但我我只是好奇为什么第一种方法不起作用。什么是J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource尝试做什么?它调用request.isUserInRole(role),但是将who和when用户角色设置为http请求?
希望我能够清楚地表达自己的理解。