Spring和CAS使用代理票证

时间:2012-01-12 16:28:03

标签: java spring spring-security single-sign-on cas

我有两个Web应用程序,Webapp A和webapp B. Webapp A是Spring 3.1 webapp。 Webapp B是独立的非spring webapp。两者都受CAS保护。我的目标是允许webapp A使用代理票据从webapp B中检索信息。

为了简化操作,我将spring-security提供的cas-sample作为webapp A.配置为使用本地cas的默认样本按预期工作。对于那些不熟悉cas-sample的人,它提供了一个使用代理票据来请求cas-sample应用程序中的另一个页面的示例。然后我使用一个简单的页面在apache webserver下使用mod_auth_cas保护webapp B.同样,webapp B按预期工作。当我更改cas-sample以使用代理票据请求webappB时,它不起作用。来自webappB请求的响应是CAS登录页面。注意:我已经为webapp B尝试了一个tomcat webapp(非spring),结果相同。这让我相信问题不在webapp B中。下面是用于使用代理票证向webapp B发出请求的代码。并且可以查看安全上下文配置here

final String targetUrl = "https://server/webappB";
final CasAuthenticationToken token = (CasAuthenticationToken) request.getUserPrincipal();
final String proxyTicket = token.getAssertion().getPrincipal().getProxyTicketFor(targetUrl);
final String serviceUrl = targetUrl+"?ticket="+URLEncoder.encode(proxyTicket, "UTF-8");
String proxyResponse = CommonUtils.getResponseFromServer(serviceUrl, "UTF-8");

我做错了什么?当上述targetUrl在webapp A中但不在外部应用程序中时,为什么会这样?

感谢您的帮助。

编辑:如果此处有帮助,则在向webapp使用代理服务单的页面发出请求时,CAS日志中会显示该内容。

[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Attempting to retrieve ticket [TGT-2-YX0RNVRDHAPyGLy6ymGGVucUSQyjtre4jvGrAxYk2hXsehsxqx-cas]
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Ticket [TGT-2-YX0RNVRDHAPyGLy6ymGGVucUSQyjtre4jvGrAxYk2hXsehsxqx-cas] found in registry.
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Added ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] to registry.
[org.jasig.cas.CentralAuthenticationServiceImpl] - Granted proxy ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] for service [https://server/webappB] for user [testUser]
[org.jasig.cas.web.support.CasArgumentExtractor] - Extractor generated service for: https://server/webappB
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Attempting to retrieve ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas]
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] found in registry.
[org.jasig.cas.ticket.registry.DefaultTicketRegistry] - Removing ticket [ST-3-JrQKqqpZJz00a2hsGZP6-cas] from registry
[org.jasig.cas.web.support.CasArgumentExtractor] - Extractor generated service for: https://server/webappB
[org.jasig.cas.web.flow.InitialFlowSetupAction] - Placing service in FlowScope: https://server/webappB
[org.jasig.cas.web.flow.InitialFlowSetupAction] - Placing service in FlowScope: https://server/webappB
[org.jasig.cas.web.support.CasArgumentExtractor] - Extractor generated service for: https://server/webappB

1 个答案:

答案 0 :(得分:6)

我终于想到了这一个。我错了,问题确实存在于webapp B中。显然,mod_auth_cas不支持代理身份验证。我能够通过我的备用webapp B(这是一个带有tomcat的简单Java webapp)获得所需的结果。此webapp使用web.xml中定义的CAS过滤器。最初不起作用的原因是validateUrl参数未设置为proxyValidate且未设置authorizedProxy参数。正确设置这些参数后,webapp B能够接受代理票证。以下是最终的过滤器配置:

   <filter>
     <filter-name>CAS Filter</filter-name>
     <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
         <param-value>https://cas.server:9443/cas/login</param-value>
     </init-param>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
         <param-value>https://cas.server:9443/cas/proxyValidate</param-value>
     </init-param>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.authorizedProxy</param-name>
         <param-value>https://webappA:8443/cas-sample/j_spring_cas_security_proxyreceptor</param-value>
     </init-param>
     <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
         <param-value>webappB:7443</param-value>
     </init-param>
   </filter>