Spring Security - 无法注销[关闭]
Posted
技术标签:
【中文标题】Spring Security - 无法注销[关闭]【英文标题】:Spring Security - cannot logout [closed] 【发布时间】:2012-12-04 22:28:46 【问题描述】:我是 Spring 框架的初学者。我和我的朋友正在波兹南理工大学写我们的工程师论文,我们遇到了 Spring Security (3.1.0) 的问题。我不能很好地退出。当我想再次登录时,我看到消息“用户已登录”(我覆盖了标准 Spring Security 错误消息)。我试图清除 SecurityContextHolder 的上下文,但它仍然不起作用。
spring-security.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<security:http auto-config="true" create-session="ifRequired">
<security:intercept-url pattern="/start"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/home" access="ROLE_USER" />
<security:session-management>
<security:concurrency-control
max-sessions="1" error-if-maximum-exceeded="true" />
</security:session-management>
<security:form-login login-page="/start"
default-target-url="/home" authentication-failure-url="/login_error?error=true"
always-use-default-target="true" />
<security:logout invalidate-session="true" logout-success-url="/start" logout-url="/j_spring_security_logout"/>
</security:http>
<security:authentication-manager>
<security:authentication-provider ref="myAuthenticationProvider"/>
</security:authentication-manager>
<bean id="myAuthenticationProvider" name="myAuthenticationProvider" class="org.pp.web.Authentication.XtbAuthenticationProvider"/>
</beans>`
web.xml
<!-- Spring Security -->
<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>
home.jsp
<a href="<c:url value="/logout" />">Logout</a>
Controller.java
@RequestMapping(value = "logout")
public String logout()
SecurityContextHolder.clearContext();
return "redirect:/j_spring_security_logout";
@RequestMapping(value = "start")
public String start(Model model, HttpServletRequest request)
// sprawdzenie czy uzytkownik nie jest juz zalogowany
if (request.getRemoteUser() == null)
return "start";
else
return "redirect:/home";
我有自己的提供商来检查登录名和密码。
AuthProvider.java
public class AuthenticationProvider implements AuthenticationProvider
private Logger logger = Logger.getLogger(AuthenticationProvider.class);
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new GrantedAuthorityImpl("ROLE_USER"));
UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication;
String username = String.valueOf(auth.getPrincipal());
String password = String.valueOf(auth.getCredentials());
if(username.length()<4)
logger.warn("Error: Login is to short for username: "+ username);
throw new BadCredentialsException("Login is to short!");
else if(password.length()<4)
logger.warn("Error: Password is to short for username: "+ username);
throw new BadCredentialsException("Password is to short!");
else if(!( (username.equals("login") & password.equals("password"))|
(username.equals("login2") & password.equals("password2"))) )
logger.warn("Error: Incorrect data for username: "+ username);
throw new BadCredentialsException("Incorrect data!");
return new UsernamePasswordAuthenticationToken(
authentication.getName(), authentication.getCredentials(),
authorities);
@Override
public boolean supports(Class<?> authentication)
return authentication.equals(UsernamePasswordAuthenticationToken.class);
我试图修复它,我找了很长时间,但我找不到解决方案。
希望你能帮助我。
马特乌什·贾穆泽克, 卢卡斯·格日博夫斯基
编辑: 我覆盖了标准 Spring Security 错误消息。
更改后的代码。
Controller.java
@RequestMapping(value = "dummy")
public String dummy()
//SecurityContextHolder.clearContext();
return "redirect:/dummy";
@RequestMapping(value = "logout")
public String logout()
//SecurityContextHolder.clearContext();
return "redirect:/start";
dummy.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<%
session.invalidate();
// String redirectURL = "http://localhost:8080/start";
// response.sendRedirect(redirectURL);
%>
<body>
<%-- <c:redirect url='http://localhost:8080/start' /> --%>
</body>
</html>
home.jsp
<a href="<c:url value='/dummy' />">Logout</a>
【问题讨论】:
【参考方案1】:Spring安全注销的标准如下:
SecurityContextHolder.clearContext();
编辑
如果您使用的是 jsp 重定向,那么您需要一个空的 jsp 来执行以下操作:
1) 使会话无效 2) 重定向到登录页面
当我说空时,我的意思是它里面的唯一内容是一个执行上述两部分的脚本。所以这个过程将如下所示:
1) 用户按下注销 2)重定向到虚拟页面 上述发生 3) 虚拟页面执行其代码 4) 用户 现已退出系统。
JSP 代码
<html>
<%session.invalidate()%>
//redirect logic
</html>
【讨论】:
谢谢,但它不起作用。 @user1910842 你能详细说明它是如何不起作用的吗?你也在使用 jsp 重定向吗? 是的,我使用重定向。就像在 Controller.java 中的 logout() 方法中一样 "return "redirect:/j_spring_security_logout";"如果我理解你的话。 @user1910842 更新以解释解决方法 非常感谢,但我仍然有问题。是的,我使用 JSP 重定向。使会话无效是什么意思?是 clearContext() 方法吗?我创建了一个空的jsp,但我不知道那里执行什么样的代码。【参考方案2】:在 JSP 重定向中没有问题,但在设置中。
试试这个:
添加到 web.xml
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
【讨论】:
以上是关于Spring Security - 无法注销[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
带有 LDAP 注销的 Spring Security 无法删除会话
注销在Spring Security OAuth2中无法正常运行