【问题标题】:Setting up Pre auth filter for CasAuthenticationFilter为 CasAuthenticationFilter 设置 Pre auth 过滤器
【发布时间】:2013-10-19 14:36:14
【问题描述】:

我为几个应用程序设置了 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 Config:http://pastie.org/private/qxcx1h8i9ys0w3lmwegiw

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

这是 CasAuthenticationFilter 根据日志验证的 URL - /j_spring_cas_security_proxyreceptor?pgtIou=PGTIOU-1-pR9r9LVJvB5EkezbMJHN-talenteye.in&pgtId=TGT-2-QXvAHIRciBNR9HU5FOvpOaHcJaBj5OJTUPPz5ZwA7yK1xH54iL-myorg.in

CasAuthenticationFilter 的实现 requiresAuthentication 如下所示:

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;
}

日志说-

19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter -     serviceTicketRequest = false
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorConfigured = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorRequest = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - requiresAuthentication = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - Request is to process authentication
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorConfigured = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorRequest = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - Responding to proxy receptor request

我很困惑如何使这两者协同工作。我想知道我是不是把事情复杂化了。任何指针都会很有帮助,因为我已经在这上面浪费了几天时间。

【问题讨论】:

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


    【解决方案1】:

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

    使用 CAS 的全部意义在于集中认证。我编写了一个扩展AbstractCasAssertionUserDetailsService 的自定义类。这不会进行身份验证。它必须在 CAS 服务器上完成。这只是准备了一个 UserDetails 对象,供 CAS 客户端 Web 应用程序使用。因此,在我的情况下不需要 PRE-AUTH。此外,我摆脱了不需要的代理受体配置。现在效果很好。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2016-07-11
      • 1970-01-01
      • 2019-04-04
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      • 2021-12-15
      相关资源
      最近更新 更多