更改已记录用户角色的Spring安全性不会立即生效

时间:2015-11-05 01:11:45

标签: java spring session spring-security roles

我正在使用Spring Security 3.2。我可以在改变角色后动态重新加载当前用户的授权:

UserDetailsImpl userDetails = new UserDetailsImpl(dao.getEntity(User.class,currentUserService.getUserDetails().getUsername()));
        Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails,userDetails.getPassword(), userDetails.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);

但它仅适用于当前用户。我想更改其他用户(已记录)角色并使用我的管理员用户动态重新加载他们的授权。我还使用SessionRegistry,并为admin服务编写方法:

  public void reloadUserAuthorizes(String username)
    {
        List<Object> loggedUsers = sessionRegistry.getAllPrincipals();
        for (Object principal : loggedUsers)
        {
            if(principal instanceof UserDetailsImpl)
            {
                final UserDetailsImpl loggedUser = (UserDetailsImpl) principal;
                if(username.equals(loggedUser.getUsername()))
                {
                    List<SessionInformation> sessionsInfo = sessionRegistry.getAllSessions(principal, false);
                    if(null != sessionsInfo && sessionsInfo.size() > 0)
                    {
                        for (SessionInformation sessionInformation : sessionsInfo)
                        {
                            sessionInformation.expireNow();
                            sessionRegistry.removeSessionInformation(sessionInformation.getSessionId());
                        }
                    }
                }
            }
        }
    }

此方法正在成功执行,并查找所有已记录的用户及其会话,但不会生效。记录并授予授权的用户,他保留他的授权,即使我的会话到期。

1 个答案:

答案 0 :(得分:0)

您可以在每个HTTP请求上重新验证用户,因此每次更改时用户角色都是最新的。

基本思路是使用自定义SecurityContextRepository,它会丢弃在http会话中保存的用户详细信息。

如需完整示例和工作项目,请在此处查看我对类似问题的回答:Spring Security logoff a user while runtime