所以伙计们,
我在spring-security.xml中有这个块,它控制到我系统的并发会话:
<security:session-management>
<security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/>
</security:session-management>
直到现在还可以。
我使用自定义实现os UserDetailsService和UserDetails在我的主体中存储额外的列。
一切正常,但在此之后,并发控制停止工作。用户仍然使用相同的用户名多次登录。
我认为在我的自定义服务中,我需要实现一些其他策略来处理并发性,但我不知道如何。
我的自定义UserDetailsService是:
public class AuthenticationService implements UserDetailsService {
@Autowired
private UserService userService;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
User user = userService.getByUsername(username);
CustomUserDetail customUserDetail = new CustomUserDetail(user);
return customUserDetail ;
}
}
我的自定义UserDetails是一个简单的bean:
public class CustomUserDetail implements UserDetails {
private String username;
private String password;
private boolean accountnonexpired;
private boolean accountnonlocked;
private boolean credentialsnonexpired;
private boolean enabled;
private String user_id;
private String org_id;
private String email;
private final Collection<? extends GrantedAuthority> authorities;
public CustomUserDetail(User user) {
this.username = user.getUsername();
this.password = user.getPassword();
this.authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
this.user_id = user.getId();
this.org_id = user.getOrganization().getId();
this.email = user.getEmail();
if(user.isActive()){
this.accountnonexpired = true;
this.accountnonlocked = true;
this.credentialsnonexpired = true;
this.enabled = true;
}
}
有人知道我还需要做什么吗?
感谢您的帮助。
答案 0 :(得分:0)
如果你没有改变其他任何东西,我怀疑你没有在CustomUserDetail对象中定义一个equals方法。实际上,它只是继承了Object中的默认值,它比较了对象实例。每当同一用户重新登录时,就会创建一个新的CustomUserDetail实例,该实例将被框架视为不同。
原始User对象按用户名检查相等性。这是你的新实施的方式。