Spring安全性Preauth:如何通过自定义身份验证过滤器

时间:2015-09-17 16:47:23

标签: spring security filter roles

我是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);)进行身份验证,但它只需要用户名和凭证,而不是角色信息。然后我尝试将不同的详细信息源J2eeBasedPreAuthenticatedWebAuthenticationDetailsS​​ource注入过滤器,因为看起来对我(我可能是错的)这个细节源会通过调用setDetails()将角色信息传递给认证对象。但J2eeBasedPreAuthenticatedWebAuthenticationDetailsS​​ource正在从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)来创建身份验证对象,但我我只是好奇为什么第一种方法不起作用。什么是J2eeBasedPreAuthenticatedWebAuthenticationDetailsS​​ource尝试做什么?它调用request.isUserInRole(role),但是将who和when用户角色设置为http请求?

希望我能够清楚地表达自己的理解。

0 个答案:

没有答案