2012-01-12 47 views
2

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

为了简化事情,我将spring-security提供的cas-sample设置为webapp A.配置为使用默认示例我的本地cas按预期工作。对于那些不熟悉CAS样本的人,它提供了一个使用代理票据来请求CAS样本应用程序中的另一个页面的示例。然后,我使用apache web服务器下的简单页面,使用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 

回答

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>