前言
最近公司我负责的一个服务(spring-boot spring-could)需要在接口级别做权限控制,本来想着是在controller层加上注解,再通过切面(aop)来实现。后来发现网上有现成的框架spring shiro 以及spring security。某位大佬曾经说过:不要重复造轮子。本着这个原则去了解了这两个框架。
选型
简单看了一下两个框架最后选择了spring shiro。这里说一下原因spring security接口设计有点问题,对用户的入侵有点太强了,扩展性不够。简单举个列子 使用security需要实现下面的接口。
这个接口只有一个方法,用户用户名获得用户相关的信息,及其权限信息。
我的那个微服务,需要通过用户及用户当前选择的数据源来获得权限信息(每个用户的每个数据源都具有不同的权限)。
这里就明显不符合要求。所以最后选择了spring shiro
整合过程
依赖
1 | <dependency> |
配置
1 |
|
自定义token 这个token是包含自己需要用来做权限的所有信息的实体,在我这主要包含,当前用户及其选择的数据源的信息
1 | /** |
定义AuthorizingRealm
1 |
|
自定义过滤器
1 |
|
问题
在修改了权限后需要清空缓存,当我是用下面的方法清除缓存的时候发现清除不掉
1 | sessionsSecurityManager.getCacheManager().getCache(WebRealm.class.getName() + ".authorizationCache").remove(authModel); |
跟它的源码发现内存的缓存使用Map来做的,我传入的AuthModel 是不同的对象,需要用SimplePrincipalCollection来包装一下。
1 | sessionsSecurityManager.getCacheManager().getCache(WebRealm.class.getName() + ".authorizationCache").remove(new SimplePrincipalCollection(authModel, WebRealm.class.getTypeName())); |
注意复写AuthModel的hashcode及equels方法
懒的话可以将对象转为jsonString
1 | public class AuthToken implements AuthenticationToken { |
需要用到的时候转回来就好了