Spring Security - 自定义UserDetailsS​​ervice和UserDetails停止工作并发控制

时间:2015-02-27 13:45:04

标签: spring-mvc spring-security

所以伙计们,

我在spring-security.xml中有这个块,它控制到我系统的并发会话:

<security:session-management>
    <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/>
</security:session-management>

直到现在还可以。

我使用自定义实现os UserDetailsS​​ervice和UserDetails在我的主体中存储额外的列。

一切正常,但在此之后,并发控制停止工作。用户仍然使用相同的用户名多次登录。

我认为在我的自定义服务中,我需要实现一些其他策略来处理并发性,但我不知道如何。

我的自定义UserDetailsS​​ervice是:

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;
    }
}

有人知道我还需要做什么吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果你没有改变其他任何东西,我怀疑你没有在CustomUserDetail对象中定义一个equals方法。实际上,它只是继承了Object中的默认值,它比较了对象实例。每当同一用户重新登录时,就会创建一个新的CustomUserDetail实例,该实例将被框架视为不同。
原始User对象按用户名检查相等性。这是你的新实施的方式。