关于使用SpringSecurity不能设置Session并发无效、剔除前一个用户无效的核心解决方案

那些年掉过SpringSecurity的坑。

最近在研究SpringBoot集成SpringSecurity权限框架的Demo,关于怎么集成,网上一大片的文章,我就不废话多说了,自行百度解决。


我使用的是注解配置,类继承WebSecurityConfigurerAdapter适配器,重写configure(HttpSecurity http)方法配置参数等。


然后是继承UserDetails抽象接口实现自定义的User对象,而SpringSecurity管理Session也是通过管理User对象实现的。


然后到了配置Session的并发步骤了,不管是通过HttpSecurity配置还是XML方式配置其目的都是一样的,以下是HttpSecurity配置。

http.sessionManagement()//Session管理器
	.maximumSessions(1)
	.sessionRegistry(sessionRegistry)
	.expiredUrl("/Member/Login.html");
好了,maximumSessions(1)是配置好了,然后去启动项目,然后你会发现登录同一个账号,并没有剔除前一个账号,这是怎么回事呢?

抛开框架暂且不说,如果是我直接写一个剔除前一个用户的话,我肯定是要得到全部用户,然后挨个挨个遍历筛选,如果存在当前登录用户就剔除前一个用户,这个需要使用if比较来实现的。

好了,问题找到了,因为SpringSecurity是通过管理UserDetails对象来实现用户管理的,按照上一步的原理,是需要进行比较实现效果的,然后呢,类的比较是不能用==比较的,类之间的比较是通过类的equals方法进行比较的,好了,问题找到了,我们自定义的User对象是没有实现equals方法的,好了,我们现在开始重写equals方法吧,关于重写的规则是:如果要重写equals方法,那么就必须要重写toStirng方法,如果要重写toString方法就最好要重写hashCode方法,所以我们需要在自定义的User对象中重写三个方法,hashCode、toString和equals方法。

	@Override
	public String toString() {
		return this.userName;
	}
	
	@Override
	public int hashCode() {
		return userName.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		return this.toString().equals(obj.toString());
	}


下面是我自定义的User类(只是示例,没有配置权限相关):
import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import com.hong610.domain.User;

/**
 * SpringSecurity User
 * @author Hong
 * @Date 2016年11月20日
 */
public class UserDetail implements UserDetails {
	
	private String userName;

	private String userPwd;

	private static final long serialVersionUID = 1L;

	public UserDetail(User user) {
		this.setUserName(user.getUserName());
		this.setUserPwd(user.getUserPwd());
	}

	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		return null;
	}

	@Override
	public String getPassword() {
		return this.getUserPwd();
	}

	@Override
	public String getUsername() {
		return this.getUserName();
	}

	@Override
	public boolean isAccountNonExpired() {
		return true;
	}

	@Override
	public boolean isAccountNonLocked() {
		return true;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		return true;
	}

	@Override
	public boolean isEnabled() {
		return true;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPwd() {
		return userPwd;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}
	
	@Override
	public String toString() {
		return this.userName;
	}
	
	@Override
	public int hashCode() {
		return userName.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		return this.toString().equals(obj.toString());
	}
}

Okay,重启项目,剔除前一个用户成功!

关于重写的规则参照《Effective Java》书籍。


  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值