以前在做项目的时候,都已实现现成的权限控制,从来没有自己研究过原理,这次趁着新项目的机会自己研究了一下。
按照教程,查资料,大概实现了一个demo,然后卡在了权限的刷新上,比如,管理员给某个角色添加,删除了新的权限,怎么才能做到用户不登录实时刷新权限呢。
最后查API文档,以及在这位仁兄的博客中找到了答案:https://blog.csdn.net/s1040342522/article/details/109495704
在使用这个博客中的方法时,主要问题在于如何获取指定用户的SimplePrincipalCollection。
完整的代码见:https://github.com/alex-zhaopeng/demo.git
@RequestMapping("/logout")
@ResponseBody
public ReturnMessage logOut(@RequestBody Map<String, Object> map) {
Subject subject = SecurityUtils.getSubject();
String username = map.get("username").toString();
List<UserVo> userVos = userService.findRolesByUsername(username);
UserVo user = !CollectionUtils.isEmpty(userVos) ? userVos.get(0) : null;
//获取指定用户的User对象,构造SimplePrincipalCollection,然后将当前subject伪装成指定用户,然后再进行缓存清除
SimplePrincipalCollection principals = new SimplePrincipalCollection(user,"AuthRealm");
subject.runAs(principals);
RealmSecurityManager rsm = (RealmSecurityManager)SecurityUtils.getSecurityManager();
AuthRealm authRealm = (AuthRealm) rsm.getRealms().iterator().next();
authRealm.clearCachedAuthorization(subject.getPrincipals());
subject.releaseRunAs();
// subject.logout();
return ReturnMessage.successWithMsg("登出成功");
}