为CasAuthenticationFilter设置Pre auth过滤器

时间:2013-10-19 14:36:14

标签: spring-security cas jasig spring-security-cas

我为几个应用程序设置了一个Spring Jasig CAS SSO。这使用CasAuthenticationFilter。所以我的webapps设置如下 -

Cas Server (Cas 3.5.2) - Cas.warApp1 - App1.warApp2 - App2.war。应用程序使用Spring 3.2.3和Spring Security 3.1.4.RELEASE。

Spring Security Confighttp://pastie.org/private/qxcx1h8i9ys0w3lmwegiw

使用此设置似乎正常工作。现在,当我在Cas Server(而不是通过Spring Cas)启用OAuth时,我无法将该身份验证与我设置的常规基于表单的身份验证集成。 Facebook OAuth集成似乎工作得很好,因为我可以看到在日志中成功检索到facebook个人资料属性。问题是,在Facebook登录后,CasAuthenticationFilter尝试使用类似的基于表单的登录机制对用户“FacebookProfile#XYZXYZ”进行身份验证,显然它没有在用户的数据库表中找到该用户。我的猜测是我需要编写一个自定义过滤器,它扩展AbstractPreAuthenticatedProcessingFilter并位于PRE_AUTH_FILTER之前的位置(检查上面的pastie配置)并且应该以某种方式将Authentication设置为右,所以{{ 1}}应该知道用户已经登录。

这是根据日志CasAuthenticationFilter进行身份验证的网址 - CasAuthenticationFilter

/j_spring_cas_security_proxyreceptor?pgtIou=PGTIOU-1-pR9r9LVJvB5EkezbMJHN-talenteye.in&pgtId=TGT-2-QXvAHIRciBNR9HU5FOvpOaHcJaBj5OJTUPPz5ZwA7yK1xH54iL-myorg.in的实施requiresAuthentication如下所示:

CasAuthenticationFilter

日志说 -

protected boolean requiresAuthentication(final HttpServletRequest request, final HttpServletResponse response) {
    final boolean serviceTicketRequest = serviceTicketRequest(request, response);
    final boolean result = serviceTicketRequest || proxyReceptorRequest(request) || (proxyTicketRequest(serviceTicketRequest, request));
    if(logger.isDebugEnabled()) {
        logger.debug("requiresAuthentication = "+result);
    }
    return result;
}

我对如何使这项工作感到困惑。我想知道我是不是太复杂了。任何指针都会非常有用,因为我已经浪费了几天时间。

1 个答案:

答案 0 :(得分:1)

我自己解决了这个问题,因此在这里发布了面临类似问题的其他人。

使用CAS的重点是集中身份验证。我写了一个扩展AbstractCasAssertionUserDetailsService的自定义类。这不进行身份验证。它必须在CAS服务器上完成。这只是准备CAS客户端Web应用程序使用的UserDetails对象。因此,在我的案例中不需要PRE-AUTH。此外,我摆脱了不需要的代理接收器配置。它现在运作良好。