2016-03-08 4 views
1

У нас есть пример веб-приложения, основанного на версии 2.2.1 для запуска приложений, использующей Spring security 3.1.3.RELEASE. Мы собираемся развернуть его на WAS 7, и мы тестируем его на IBM WebSphere 8.5.5.8 (Liberty). Наша проблема заключается в том, что после успешного/неудачного запроса на вход какая-то вещь искажает значение servletPath запроса и устанавливает его в null.IBM WebSphere 8.5.5.8 (Liberty) + Spring Security 3.1.3.RELEASE

((HttpServletRequest) запрос) .getServletPath()

Это время, когда LocaleFilter пытается сделать chain.doFilter, используя значение/j_security_check для getServletPath(), и мы сталкиваемся с:

исключения брошенного класса приложения 'org.springframework.security.web.util.AntPathRequestMatcher.getRequestPath: 116' java.lang.NullPointerException: в org.springframework.security.web.util.AntPathRequestMatche r.getRequestPath (AntPathRequestMatcher.java:116) на org.springframework.security.web.util.AntPathRequestMatcher.matches (AntPathRequestMatcher.java:100) на org.springframework.security.web.DefaultSecurityFilterChain.matches (DefaultSecurityFilterChain.java: 42) на org.springframework.security.web.FilterChainProxy.getFilters (FilterChainProxy.java:203) в org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:176) в org.springframework.security. web.FilterChainProxy.doFilter (FilterChainProxy.java:160) на org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:346) на org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java: 259) at com.i bm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:207) на [внутренних классов] на com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter (SiteMeshFilter.java:59) на com.ibm. ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:207) на [внутренних классов] на org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite (NormalRewrittenUrl.java:213) на org.tuckey. web.filters.urlrewrite.RuleChain.handleRewrite (RuleChain.java:171) на org.tuckey.web.filters.urlrewrite.RuleChain.doRules (RuleChain.java:145) на org.tuckey.web.filters.urlrewrite. UrlRewriter.processRequest (UrlRewriter.java:92) на org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter (UrlRewriteFilter.java:394) на com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:207) на [внутренних классов] на ir.dpi.webapp.filter.LocaleFilter.doFilterInternal (LocaleFilter .java: 67) на org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:76) на com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:207) в [ внутренние классы] на org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:88) на org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:76) в com.ibm.ws .webcontainer.filter.FilterInstanceWrapper.doFilter (FilterIns tanceWrapper.java:207) на [внутренних классов] на com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent (SiteMeshFilter.java:129) в com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter (SiteMeshFilter.java: 77) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.Java: 207) на [внутренние классы]

Это наш security.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:beans="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<http pattern="/images/**" security="none"/> 
<http pattern="/styles/**" security="none"/> 
<http pattern="/scripts/**" security="none"/> 

<http auto-config="false" create-session="always"> 
    <intercept-url pattern="/app/admin/**" access="ROLE_ADMIN"/> 
    <intercept-url pattern="/app/passwordHint*" access="ROLE_ANONYMOUS,ROLE_ADMIN,ROLE_USER"/> 
    <intercept-url pattern="/app/signup*" access="ROLE_ANONYMOUS,ROLE_ADMIN,ROLE_USER"/> 
    <intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER"/> 
    <form-login login-page="/login" authentication-failure-url="/login?error=true" login-processing-url="/j_security_check"/> 
    <remember-me user-service-ref="userDao" key="e37f4b31-0c45-11dd-bd0b-0800200c9a66"/> 
</http> 

<authentication-manager > 
    <authentication-provider user-service-ref="userDao" > 
     <password-encoder ref="passwordEncoder" > 
      <salt-source ref="saltSource" /> 
     </password-encoder> 
    </authentication-provider> 
</authentication-manager> 

<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource" 
    p:userPropertyToUse="username"/> 


<global-method-security> 
    <protect-pointcut expression="execution(* *..service.UserManager.getUsers(..))" access="ROLE_ADMIN"/> 
    <protect-pointcut expression="execution(* *..service.UserManager.removeUser(..))" access="ROLE_ADMIN"/> 
</global-method-security> 
</beans:beans> 

Любая помощь будет оценена.

ответ

0

Я нашел решение, используя this code ranch topic. AppFuse использует различные фильтры (javax.servlet) и механизм WAS Wrapping чувствителен к приоритету создания сеанса. Поэтому я переместил Spring securityFilter, отображая вверх в файле web.xml.

 <filter-mapping> 
     <filter-name>securityFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>INCLUDE</dispatcher> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>sitemesh</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    ... 

Теперь процесс входа в систему выполняется полностью.

Пожалуйста, обратите внимание, что жизненно важно, чтобы установить эти параметры в Liberty server.xml:

<httpSession cookieName="MY_LIBERTY_COOKIE" /> 
<basicRegistry /> 

Эквивалентные параметры в IBM WebSphere Application Server (WAS Full) устанавливается в:

управления сеансов -> Общие свойства -> Включить печенье

Также в WAS версия 7 (может применяться к другим версиям) требуется использовать:

<http auto-config="false" disable-url-rewriting="true" create-session="always"> 

в файле весной security.xml.