我正在使用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:“自动装配”继承与依赖注入 - javaImprove 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 …