那些年掉过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》书籍。