我为几个应用程序设置了一个Spring Jasig CAS SSO。这使用CasAuthenticationFilter
。所以我的webapps设置如下 -
Cas Server (Cas 3.5.2) - Cas.war
,App1 - App1.war
和App2 - App2.war
。应用程序使用Spring 3.2.3和Spring Security 3.1.4.RELEASE。
Spring Security Config
:http://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;
}
我对如何使这项工作感到困惑。我想知道我是不是太复杂了。任何指针都会非常有用,因为我已经浪费了几天时间。
答案 0 :(得分:1)
我自己解决了这个问题,因此在这里发布了面临类似问题的其他人。
使用CAS的重点是集中身份验证。我写了一个扩展AbstractCasAssertionUserDetailsService
的自定义类。这不进行身份验证。它必须在CAS服务器上完成。这只是准备CAS客户端Web应用程序使用的UserDetails
对象。因此,在我的案例中不需要PRE-AUTH。此外,我摆脱了不需要的代理接收器配置。它现在运作良好。