2015-12-04 1 views
2

Я переношу WebApp с 3 по 3 весны с загрузкой.Настройте CAS с помощью Spring (Boot) без web.xml

оригинальный web.xml ниже

<listener> 
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> 
</listener> 

<filter> 
<filter-name>CAS Authentication Filter</filter-name> 
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 
<init-param> 
    <param-name>casServerLoginUrl</param-name> 
    <param-value>https://casserver/login</param-value> 
</init-param> 
<init-param> 
    <param-name>serverName</param-name> 
    <param-value>http://myapp</param-value> 
</init-param> 
</filter> 

<filter> 
<filter-name>CAS Validation Filter</filter-name> 
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 
<init-param> 
    <param-name>casServerUrlPrefix</param-name> 
    <param-value>https://casserver/login</param-value> 
</init-param> 
<init-param> 
    <param-name>serverName</param-name> 
    <param-value>http://myapp</param-value> 
</init-param> 
<init-param> 
    <param-name>encoding</param-name> 
    <param-value>UTF-8</param-value> 
</init-param> 
</filter> 

<filter> 
<filter-name>CAS Single Sign Out Filter</filter-name> 
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> 
</filter> 

<filter-mapping> 
<filter-name>CAS Single Sign Out Filter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter-mapping> 
<filter-name>CAS Authentication Filter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
<filter-name>CAS Validation Filter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<session-config> 
<session-timeout>90</session-timeout> 
</session-config> 

<context-param> 
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
<param-value>messages</param-value> 
</context-param> 

Я пытаюсь зарегистрировать все фильтры, слушателей и отображения внутри моего класса AppConfic (ниже и НЕ заполняйте, так как он уже не работает ...)

@Configuration 
public class MyWebApplicationInitializer implements ServletContextInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) { 
     servletContext.addListener(new SingleSignOutHttpSessionListener()); 

     Cas20ProxyReceivingTicketValidationFilter cas20 = new Cas20ProxyReceivingTicketValidationFilter(); 
     cas20.setServerName("http://myapp"); 

     AuthenticationFilter authenticationFilter = new AuthenticationFilter(); 
     authenticationFilter.setCasServerLoginUrl("https://casserver"); 
     authenticationFilter.setServerName("http://myapp"); 

     servletContext.addFilter("CAS Authentication Filter", authenticationFilter); 
     servletContext.addFilter("CAS Validation Filter", cas20); 
     servletContext.addFilter("CAS Single Sign Out Filter", new SingleSignOutFilter()); 
    } 
} 

1/cAS20 проблема при создании экземпляра

я не могу определить cas20 casServerUrlPrefix ... Там нет сеттера?!

2/AuthenticationFilter проблема

Даже с имя_сервером определяется, во время запуска, происходит следующее сообщение об ошибке:

java.lang.IllegalArgumentException: serverName or service must be set. 
    at org.jasig.cas.client.util.CommonUtils.assertTrue(CommonUtils.java:116) ~[cas-client-core-3.2.1.jar:3.2.1] 
    at org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:103) ~[cas-client-core-3.2.1.jar:3.2.1] 
    at org.jasig.cas.client.authentication.AuthenticationFilter.init(AuthenticationFilter.java:96) ~[cas-client-core-3.2.1.jar:3.2.1] 
    at org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:84) ~[cas-client-core-3.2.1.jar:3.2.1] 
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279) ~[tomcat-embed-core-8.0.28.jar:8.0.28] 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:109) ~[tomcat-embed-core-8.0.28.jar:8.0.28] 

Можно ли определить внутри ServletContextInitializer такого рода фильтры? Нужно ли загружать xml (dispatcher-servlet.xml как?)

ответ

5

Я настоятельно рекомендую прочитать на Servlet 3.0 spec и как это работает, что web.xml можно портировать отлично, если вы знаете, что делаете. Вам просто нужно указать параметры init при регистрации.

<filter> 
<filter-name>CAS Validation Filter</filter-name> 
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 
<init-param> 
    <param-name>casServerUrlPrefix</param-name> 
    <param-value>https://casserver/login</param-value> 
</init-param> 
<init-param> 
    <param-name>serverName</param-name> 
    <param-value>http://myapp</param-value> 
</init-param> 
<init-param> 
    <param-name>encoding</param-name> 
    <param-value>UTF-8</param-value> 
</init-param> 
</filter> 

с этим

<filter-mapping> 
<filter-name>CAS Validation Filter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

бы привести к примерно следующее Java и с помощью WebApplicationInitializer.

@Configuration 
public class MyWebApplicationInitializer implements ServletContextInitializer { 

    @Override 
    public void onStartup(ServletContext sc) { 
     FilterRegistration.Dynamic cas20Registration = sc.addFilter("CAS Validation Filter", Cas20ProxyReceivingTicketValidationFilter.class); 
     cas20Registration.setInitParameter("casServerUrlPrefix casServerUrlPrefix", "https://casserver/login"); 
     cas20Registration.setInitParameter("serverName", "http://myapp"); 
     cas20Registration.setInitParameter("encoding", "UTF-8"); 
     cas20Registration.addMappingForUrlPatterns(null, false, "/*"); 
    } 
} 

Вышеуказанный перевод xml на java-код на 1-й. Это должно дать вам представление о других фильтрах.

Однако вы используете Spring Boot, что делает его более легким. Просто создайте метод @Bean, который возвращает FilterRegistrationBean для необходимых фильтров. См. Также соответствующий section в справочном руководстве Spring Boot.

@Bean 
public FilterRegistrationBean cas20Registration() { 
    FilterRegistrationBean cas20 = new FilterRegistrationBean(); 
    cas20.setFilter(new Cas20ProxyReceivingTicketValidationFilter()); 
    cas20.addUrlPatterns("/*"); 
    cas20.addInitParameter("casServerUrlPrefix casServerUrlPrefix", "https://casserver/login"); 
    cas20.addInitParameter("serverName", "http://myapp"); 
    cas20.addInitParameter("encoding", "UTF-8");   
    return cas20; 
} 

Вы можете сделать то же самое для других фильтров, слушателей и необходимых компонентов.

Существует одна вещь, которую вы не можете сделать с настройкой на основе Java и которая устанавливает значение таймаута сеанса. Однако вы можете просто переместить это на application.properties и добавить свойство server.session.timeout. Вам нужно будет умножить значение на 60, как и в web.xml, за считанные минуты, а в файле свойств ожидается, что оно будет в секундах.

server.session.timeout=5400 # 90 minutes 
+0

просто здорово, спасибо! –

+0

Это основано на стандартной сборке jhipster, это помогло мне настроить CAS для весны boot-https://github.com/jgribonvald/demo-spring-cas-angular – chrismarx