使用场景
假设用户A具有Authority1,Authority2两个权限,用户A登录系统进行相关操作,而此时系统管理员需要删除用户A的Authority2权限,但是需要用户A重新登录权限修改才会生效,如果用户A不重新登录,那么用户A仍然拥有Authority2权限。因此,系统管理员修改完用户A的权限后需要让用户A的登录信息失效。
实现
1. 新建一个Bean
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
2. 注入配置文件
@Autowired
private SessionRegistry sessionRegistry;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
......
.and()
.sessionManagement()
.maximumSessions(1)
.sessionRegistry(sessionRegistry);
}
3. 使用户session信息失效
@Autowired
private SessionRegistry sessionRegistry;
// 根据用户清除session
@GetMapping("/removeUserSessionByUsername")
public Object removeUserSessionByUsername(@RequestParam String username) {
List<Object> users = sessionRegistry.getAllPrincipals(); // 获取session中所有的用户信息
for (Object principal : users) {
if (principal instanceof LoginUser) {
final LoginUser loggedUser = (LoginUser) principal;
if (username.equals(loggedUser.getUsername())) {
List<SessionInformation> sessionsInfo = sessionRegistry.getAllSessions(principal, false); // false代表不包含过期session
if (null != sessionsInfo && sessionsInfo.size() > 0) {
for (SessionInformation sessionInformation : sessionsInfo) {
sessionInformation.expireNow();
}
}
}
}
}
return "操作成功";
}
代码地址 https://github.com/923226145/SpringSecurity/tree/master/chapter10