Spring и CAS с использованием Proxy Tickets - PullRequest
2 голосов
/ 12 января 2012

У меня есть два веб-приложения: Webapp A и Webapp B. Webapp A - это веб-приложение Spring 3.1. Веб-приложение B - это отдельное не весеннее веб-приложение. Оба защищены CAS. Моя цель - разрешить веб-приложению A использовать прокси-билет для получения информации из веб-приложения B.

Для упрощения я взял cas-пример, предоставленный Spring-Security, в качестве веб-приложения A. Образец по умолчанию, настроенный для использования моего локального cas-сервера, работает как положено. Для тех, кто не знаком с cas-sample, он предоставляет пример, использующий билет прокси-сервера для запроса другой страницы в приложении cas-sample. Затем я использую простую страницу в веб-сервере apache, защищенном с помощью mod_auth_cas для веб-приложения B. Опять же, веб-приложение B работает как положено. Когда я изменяю cas-sample для запроса webappB, используя прокси-билет, он не работает. Ответ на запрос webappB - страница входа в CAS. Примечание: я попробовал веб-приложение tomcat (не пружинное) для веб-приложения Б, с тем же результатом. Это заставляет меня поверить, что проблема не в веб-приложении B. Ниже приведен код, используемый для отправки запроса в веб-приложение B с использованием прокси-билета. А конфигурацию контекста безопасности можно посмотреть здесь .

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 находится в веб-приложении A, а не во внешнем приложении?

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ : Если это поможет, вот что отображается в журнале 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 Ответ

6 голосов
/ 13 января 2012

Я наконец понял это.Я был не прав, проблема лежала в webapp B. Видимо, проверка подлинности прокси не поддерживается mod_auth_cas.Я смог получить желаемые результаты с моим альтернативным веб-приложением B (которое было простым веб-приложением на Java с tomcat).В этом веб-приложении использовался фильтр CAS, определенный в файле web.xml.Причина, по которой это изначально не работало, заключается в том, что для параметра validateUrl не было установлено значение proxyValidate, а для параметра authorProxy не было установлено.После правильной установки этих параметров веб-приложение 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>
...