2015-03-13 6 views
0

У меня возникла проблема с Spring Security. Я могу войти, но не выйти (по крайней мере, не так, как ожидалось).Весенний выход безопасности

После входа в систему я буду перенаправлен в /secure/home.xhtml < - это работает нормально и как ожидается. Но я не могу выйти из системы через # {request.contextPath}/logout. (Я изменил выход из системы URL в конфигурации пружинной безопасности, но я также пробовал с установленным по умолчанию) Существует всегда 404.

Вот код до сих пор:

< index.xhtm - отлично работает

<form method="POST" id="loginForm" action="#{request.contextPath}/j_spring_security_check" class="form-signin" autocomplete="off"> 
      <div class="form-group"> 
       <label for="username" class="control-label">#{bundle["login.username"]}</label> 
       <input type="text" name="username" id="username" class="input-block-level form-control" 
         placeholder="#{bundle['label.username']}" required="true" tabindex="1" /> 
       <span class="help-block"></span> 
      </div> 
      <div class="form-group"> 
       <label for="password" class="control-label">#{bundle["login.password"]}</label> 
       <input type="password" class="input-block-level form-control" name="password" id="password" tabindex="2" 
         placeholder="#{bundle['label.password']}" required="true" /> 
       <span class="help-block"></span> 
      </div> 
      <button type="submit" tabindex="3" class="btn btn-success btn-block">#{bundle["login.action"]}</button> 
      <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
     </form> 

весна-security.xhtml, HTTP конф

<security:http use-expressions="true" > 
     <security:intercept-url pattern="/secure/**" access="hasAnyRole('USER','ADMIN')" /> 
     <security:intercept-url pattern="/admin/**" access="hasRole('ADMIN')" /> 
     <!--<security:access-denied-handler error-page="/404.xhtml" />--> 
     <security:form-login 
      login-page="/index.xhtml" 
      default-target-url="/secure/home.xhtml" 
      authentication-failure-url="/index.xhtml?error" 
      username-parameter="username" 
      password-parameter="password" /> 
     <security:logout logout-url="/logout" logout-success-url="/index.xhtml?logout" invalidate-session="true" delete-cookies="JSESSIONID" /> 
     <security:csrf /> 
    </security:http> 

Это способ, которым я пытался осуществить выход из системы в отношении к другим ответам здесь STA ckoverflow:

<a href="#{request.contextPath}/logout">logout</a> 
        <h:outputLink value="#{request.contextPath}/logout">Logout</h:outputLink> 

Но обе ссылки не работают. Я получаю 404. Я также читал, что вы должны заменить request.contextPath на pageContext.request.contextPath, но это тоже не сработало. (Вместо локального хоста: 8080/myContext/выход из системы ссылка перенаправляет меня на локальный хост: 8080/выход из системы)

Учебника показал мне, что выход из него, может быть также реализованы с этим:

<form method="POST" id="loginForm" action="#{request.contextPath}/logout" class="form-signin" autocomplete="off"> 
         <button type="submit" tabindex="3" class="btn btn-success btn-block">#{bundle["logout.action"]}</button> 
         <input type="hidden" name="#{_csrf.parameterName}" value="#{_csrf.token}" /> 
        </form> 

В начале это, казалось, решило мою проблему, но после добавления большего количества страниц в безопасный раздел, например, «profile.xhtml», я попал под нежелательное поведение, которое я выхожу из системы после загрузки страницы. Итак, если я добавлю форму выхода, как указано выше, в моем home.xhtml, кажется, что я выхожу из системы, даже если я не нахожусь на выходе из системы. Если я обновляю страницу, я буду перенаправлен на index.xhtml (login), даже если я НЕ нажимал «Выход». Поэтому, если я нажму ссылку на profile.xhtml, я, естественно, буду перенаправлен на index.xhtml, поскольку весна думает, что я вышел из системы. Без этой формы я остаюсь в системе, но не могу выйти из системы! Это беспорядок!

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

HTTP Status 403 - Expected CSRF token not found. Has your session expired? 

type Status report 

messageExpected CSRF token not found. Has your session expired? 

descriptionAccess to the specified resource has been forbidden. 

Я действительно не знаю, что случилось с моей конфигурации :(

Вот мой! web.xml:.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
     <param-value>messages</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>server</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:/application-context.xml 
      classpath:/application-security.xml 
     </param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 

    <!-- Predefined pages --> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
    <!-- <error-page> 
     <error-code>403</error-code> 
     <location>/error.xhtml</location> 
    </error-page>--> 
    <error-page> 
     <error-code>404</error-code> 
     <location>/404.xhtml</location> 
    </error-page> 
    <error-page> 
     <error-code>500</error-code> 
     <location>/error.xhtml</location> 
    </error-page> 
    <error-page> 
     <exception-type>javax.faces.application.ServletException</exception-type> 
     <location>/index.xhtml</location> 
    </error-page> 
    <error-page> 
     <exception-type>java.lang.Exception</exception-type> 
     <location>/error.xhtml</location> 
    </error-page> 

    <session-config> 
     <session-timeout>30</session-timeout> 
    </session-config> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/logout</url-pattern> 
    </filter-mapping> 

    <!-- MIME TYPES --> 
    <mime-mapping> 
     <extension>css</extension> 
     <mime-type>text/css</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>eot</extension> 
     <mime-type>application/x-font-eot</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>js</extension> 
     <mime-type>text/javascript</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>latex</extension> 
     <mime-type>application/x-latex</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>otf</extension> 
     <mime-type>application/x-font-opentype</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>roff</extension> 
     <mime-type>application/x-troff</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>svg</extension> 
     <mime-type>application/svg+xml</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>ttf</extension> 
     <mime-type>application/x-font-ttf</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>woff</extension> 
     <mime-type>application/x-font-woff</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>woff2</extension> 
     <mime-type>application/x-font-woff2</mime-type> 
    </mime-mapping> 
</web-app> 

Использование GlassFish 4.1, Spring Framework версии 4.1.2.RELEASE, и весна версия безопасности 3.2.5.RELEASE

Буду признателен за каждый ответ. Эта ошибка уже приняла два дня без каких-либо решений :(

ответ

0

Вы включена защита CRLF в.

Вы можете попытаться поддержать CRLF, добавив в вашу форму:

<input type="hidden" 
    name="${_csrf.parameterName}" 
    value="${_csrf.token}"/> 

Если это не работает, вы можете удалить CSRF - хотя это не рекомендуется.

Дополнительная информация: http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#csrf

0

с помощью пружинной URL-адреса taglig или JSTL URL-адрес TagLib записать свой адрес. This post хорошо для научиться Configure Spring Security