2012-01-12 2 views
2

Webapp A와 Webapp B의 두 가지 웹 응용 프로그램이 있습니다. Webapp A는 Spring 3.1 webapp입니다. Webapp B는 별도의 비 스프링 웹 응용 프로그램입니다. 둘 다 CAS에 의해 보호됩니다. 제 목표는 webapp A가 프록시 티켓을 사용하여 webapp B에서 정보를 검색하는 것입니다.프록시 티켓을 사용하는 스프링 및 CAS

간단히하기 위해 스프링 보안에서 제공하는 cas 샘플을 webapp A로 가져 왔습니다. 사용하도록 구성된 기본 샘플 내 로컬 cas 예상대로 작동합니다. cas 샘플에 익숙하지 않은 사용자에게는 프록시 티켓을 사용하여 cas-sample 어플리케이션 내의 다른 페이지를 요청하는 예제가 제공됩니다. 그런 다음 webapp B에 mod_auth_cas를 사용하여 보호 된 아파치 웹 서버에서 간단한 페이지를 사용합니다. 다시 Webapp B가 예상대로 작동합니다. cas-sample을 프록시 티켓을 사용하여 webappB를 요청하도록 변경하면 작동하지 않습니다. webappB에 대한 요청의 응답은 CAS 로그인 페이지입니다. 참고 : Webapp B에 대해 tomcat webapp (비 스프링)을 시도했지만 동일한 결과가 나타납니다. 어떤 문제가 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에 있지만 외부 응용 프로그램에없는 경우 왜이 기능을 사용할 수 있습니까?

도움 주셔서 감사합니다.

EDIT : 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>