Spring Security更改登录用户的角色不会立即生效 - java

我正在使用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,并为管理服务编写方法:

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

此方法已成功执行,并且可以找到所有已登录的用户及其会话,但是此方法无效。记录并授予授权的用户,即使我终止他的会话,他也会保留其授权。

参考方案

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

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

有关完整示例和可行项目的信息,请在此处查看我对类似问题的回答:Spring Security logoff a user while runtime

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring Security @Secured批注和用户权限 - java

这是关于Spring v.4(MVC +安全性)的。我已经实现了UserDetailsServiceImpl,其中在loadUserByUsername方法内部向用户授予了其权限。说的很简单:public UserDetails loadUserByUsername(String username) { ... Collection<GrantedAu…

春季安全值得付出努力 - java

我一直在关注春季安全性,并注意到它是多么大的包装。我想知道是否值得花一些时间来加强这一点。Spring Security 2.0+为您节省了大量时间,还是以任何方式简化了您的项目? java参考方案 几年前,我考虑将其用于Spring项目,并选择了它,因为它是一个非常繁琐的框架,恕我直言,它提供的灵活性不是必需的。 (据我估计)减少我们自己的身份验证/授权的…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

Spring Boot:java.time.Duration的默认序列化从字符串更改为数字 - java

我们最近从Spring Boot 2.1.9升级到2.2.1,这导致我们的测试失败。调查导致结果,默认情况下java.time.Duration类型现在序列化为不同的序列。现在,我们将得到"PT15M",而不是在JSON消息中包含字符串"900.0"。 POJO定义如下所示@JsonProperty(required …