весенний выход из системы безопасности вызывает исключение NullPointerException - PullRequest
8 голосов
/ 07 сентября 2011

Я уже некоторое время пытаюсь понять безопасность пружины, и я справился с большинством вещей, за исключением аспекта logout.Перебирая другие вопросы по SO, я почувствовал, что большинство из них столкнулись с проблемами, связанными с прекращением сеанса.

Я, с другой стороны, сталкиваюсь с совершенно другими проблемами.Мой XML-файл безопасности настроен следующим образом:

<http path-type="ant" auto-config="false" use-expressions="true"
    access-denied-page="/?login_error=2">
    <intercept-url pattern="/web/open/**" access="permitAll" />
    <intercept-url pattern="/web/**" access="isAuthenticated()" />

    <form-login login-processing-url="/static/j_spring_security_check"
        default-target-url="/web/base/view" always-use-default-target="true"
        login-page="/" authentication-failure-url="/?login_error=1" />

    <logout logout-url="/static/j_spring_security_logout"
        invalidate-session="true" logout-success-url="/" />
</http>

В моем web.xml я сопоставил login controller с корневым контекстом [используя список welcome-file], а также у меня есть необходимые springSecurityFilterChain настройка.Теперь операции входа в систему проходят отлично.Целевая JSP имеет ссылку для выхода из системы:

<a href="<c:url value="/static/j_spring_security_logout"/>">Logout</a>

Однако всякий раз, когда я нажимаю на ссылку выхода из системы, я получаю ужасное NullPointerException.Кто-нибудь может дать мне знать, если я совершил здесь какую-то явную ошибку?


Стек исключений:

java.lang.NullPointerException
    at java.util.Hashtable.get(Hashtable.java:334)
    at org.apache.tomcat.util.http.Parameters.getParameterValues(Parameters.java:116)
    at org.apache.tomcat.util.http.Parameters.getParameter(Parameters.java:127)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1133)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:384)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:140)
    at org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler.determineTargetUrl(AbstractAuthenticationTargetUrlRequestHandler.java:86)
    at org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler.handle(AbstractAuthenticationTargetUrlRequestHandler.java:67)
    at org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler.onLogoutSuccess(SimpleUrlLogoutSuccessHandler.java:28)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:100)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)

Спасибо, что нашли время.

1 Ответ

12 голосов
/ 07 сентября 2011

Метод determineTargetUrl в AbstractAuthenticationTargetUrlRequestHandler, похоже, не работает при получении параметров запроса. Для меня обычно хорошо предоставить defaultTargetUrl и установить alwaysUseDefaultTargetUrl в true, что означает, что determineTargetUrl всегда возвращает заданный URL и предотвращает магию определения URL.

Я бы сделал это, зарегистрировав собственную реализацию LogoutSuccessHandler, например:

<logout
    logout-url="/static/j_spring_security_logout"
    invalidate-session="true"
    success-handler-ref="myLogoutSuccessHandler" />

вместо logout-success-url.

A LogoutSuccessHandler может выглядеть так же просто, как:

public class MyLogoutSuccessHandler extends AbstractAuthenticationTargetUrlRequestHandler implements LogoutSuccessHandler {

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication throws IOException, ServletException {
        // maybe do some other things ...
        super.handle(request, response, authentication);
    }
}

Установите URL для выхода из системы как defaultTargetUrl в контексте безопасности при определении bean-компонента для пользовательского LogoutSuccessHandler:

<bean id="myLogoutSuccessHandler" class="foobar.impl.MyLogoutSuccessHandler">
    <property name="defaultTargetUrl" value="/" />
    <property name="alwaysUseDefaultTargetUrl" value="true" />
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...