我正在使用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());
}
}
}
}
}
}
此方法正在成功执行,并查找所有已记录的用户及其会话,但不会生效。记录并授予授权的用户,他保留他的授权,即使我的会话到期。
答案 0 :(得分:0)
您可以在每个HTTP请求上重新验证用户,因此每次更改时用户角色都是最新的。
基本思路是使用自定义SecurityContextRepository
,它会丢弃在http会话中保存的用户详细信息。
如需完整示例和工作项目,请在此处查看我对类似问题的回答:Spring Security logoff a user while runtime