Проблема с выходом из Spring Security
У меня проблема с выходом из среды Spring.
Во-первых, когда я хочу, чтобы j_spring_security_logout обработал это для меня, я получаю 404 j_spring_security_logout, не найденный: sample-security.xml:
<http>
<intercept-url pattern="/messageList.htm*" access="ROLE_USER,ROLE_GUEST" />
<intercept-url pattern="/messagePost.htm*" access="ROLE_USER" />
<intercept-url pattern="/messageDelete.htm*" access="ROLE_ADMIN" />
<form-login login-page="/login.jsp" default-target-url="/messageList.htm"
authentication-failure-url="/login.jsp?error=true" />
<logout/>
</http>
Пример URL-ссылки для выхода из системы на странице JSP:
<a href="<c:url value="/j_spring_security_logout" />">Logout</a>
Когда я пытаюсь использовать пользовательскую страницу JSP, т.е. я использую форму входа в систему для этой цели, я получаю лучший результат, по крайней мере, он попадает на страницу входа в систему, но другая проблема заключается в том, что вы не выходите из системы, так как вы можете напрямую ввести URL, который должен будь осторожен, купи, ты все равно пройдешь.
Немного изменены из предыдущих списков:
<http>
<intercept-url pattern="/messageList.htm*" access="ROLE_USER,ROLE_GUEST" />
<intercept-url pattern="/messagePost.htm*" access="ROLE_USER" />
<intercept-url pattern="/messageDelete.htm*" access="ROLE_ADMIN" />
<form-login login-page="/login.jsp" default-target-url="/messageList.htm"
authentication-failure-url="/login.jsp?error=true" />
<logout logout-success-url="/login.jsp" />
</http>
<a href="<c:url value="/login.jsp" />">Logout</a>
Спасибо за помощь
6 ответов
У меня только что была эта проблема.
Вы должны убедиться в web.xml
ваш фильтр безопасности соответствует URL /j_spring_security_logout
например
<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>/j_spring_security_logout</url-pattern>
</filter-mapping>
Вы должны сделать запрос POST. Что-то вроде того:
<form action="${logoutUrl}" method="post" id="logoutForm">
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}" />
</form>
<script>
function formSubmit() {
document.getElementById("logoutForm").submit();
}
</script>
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>
Welcome : ${pageContext.request.userPrincipal.name} |
<a href="javascript:formSubmit()"> Logout</a>
</h2>
</c:if>
Я столкнулся с той же проблемой и, потеряв надежду, наконец-то случайно узнал ответ. Конечно, мы многому учимся, читая и используя чужие коды, и, делая это, мы наследуем настройки, о которых мало что знаем.
И это то, что случилось со мной при программировании с использованием Spring Security.
В XML- коде Spring Security внутри тега http есть такая строка:
<logout invalidate-session="true" logout-success-url="/login" logout-url="/logout" />
Я получил эту строку во время моего исследования из какого-то учебника или примера. И через 2 дня, борясь с ключевым словом j_spring_security_logout и получив только ошибку 404, я понял это.
В тэге logout, который я использую, есть этот параметр logout-url, установленный в "/logout". Затем я понял, что в соответствии с моими настройками моя весна ожидает получения / выхода из системы вместо / j_spring_security_logout.
Как только я обновил свой код соответственно, он заработал как шарм.
Связана ли ссылка на выход из системы с контекстным путем?
Например, если ваш контекстный путь - "myapp", где указана вышеупомянутая ссылка?
"http: // localhost: 8080 / myapp / j_spring_security_logout" или "http://localhost:8080/j_spring_security_logout"?
На самом деле, j_spring_security_logout действителен только в контексте веб-приложения, поэтому только первая ссылка приведет к правильному URL
Я была такая же проблема.
Кажется, ошибка на 3.0.6!
Я просто понизил до 3.0.5, и все работает хорошо.
Попробуйте эту ссылку на своей странице, которая содержит ссылку на выход из системы:
<h:outputLink value="#{request.contextPath}/logout.jsp">Logout</h:outputLink>
и создайте файл logout.jsp в папке "webcontent" со следующим кодом:
<% response.sendRedirect("/#{request.contextPath}/j_spring_security_logout"); %>
если произошла ошибка, попробуйте изменить "#{request.contextPath}" на имя вашего проекта ex: мой проект называется "security", поэтому я использую в моем файле logout.jsp:
<% response.sendRedirect("/security/j_spring_security_logout"); %>