shiro 权限认证 VS 过滤器(拦截器)认证

shiro 的权限池在realm的 doGetAuthorization方法里,从DB里查出当前用户的权限字符串SET,放入shiro的info里。

过滤器的权限池在 session里面,登录完之后,会把当前用户的权限集合放入session里(SESSION方案)。

最后使用这个权限池的时候----

shiro是在诸如@RequiresPermissions,<shiro:hasPermission>,subject.isPermitted(),等等地方调用的时候,会根据传入的参数去权限池里匹配。从而会带来大量注解,要编程去写入各种权限参数,工作量还是可观的。

过滤器呢,在其拦截方法里,拦截到URL,再对其根据权限池进行匹配。也没有什么额外的工作量了,都统一处理。此种方案好处,还可以在拦截器里根据URL进行日志处理(URL肯定是唯一的,可以据此key得到操作名,时间、用户、操作名都有了,状态可以在过滤器的targetMethod返回的JSON获得,这样一个日志记录就产生了)。

我个人认为,拦截器方案可能在权限认证方面,更加方便。但是并不能说shiro不好,shiro提供了一系列权限功能,比如remberme,session管理等等,这些你用拦截器是没法做的。

同样,日志处理也可以用类似于注解AOP方式来处理,也可以通过过滤器来做,同样,个人还是觉得拦截器可能更方便,注解也需要很多额外的工作量(至少每个方法上都要写注解吧,因为方法名无法唯一,所以不能像URL那样做key得到操作名,也就需要写死操作名了。那么多方法呢....工作量也很可观)

(但是拦截器做日志有个注意点,需要维护URL和操作名的关系,可以在菜单表里维护按钮。这样当然更合理,菜单表本来最好就应该有按钮的信息)

 -----如果想维护按钮的权限,可以这样:权限赋予页面里只有菜单、菜单下面查询按钮、菜单下面窗口里面的按钮B(弹出窗口的按钮A不需要了)。在requiresPermissions时候,可以在A返回页面controller方法上面,用 ,  集合窗口里面所有的权限字符串,表示只有拥有所有窗口里面子按钮权限才能弹出窗口。这样日志也是精确到CURD(不是什么弹出窗口也记录),按钮也不太乱。注意,一般在窗口里都是AJAX请求,这个时候权限不够的话 不应该是返回JSP了,应该是JSON,要重写下shiro的相关基类。

----如果不想维护按钮权限,又想记录按钮日志,在权限赋予页面只需要不显示出按钮即可。

---日志最重要的信息,操作名称可以这么做:往上递归出父节点的menuName,再拼上自己的menuName,再把他放入map,key就是url了,(也可以是权限字符串,就需要对按钮进行权限维护了),再把此map放入cache里(因为一般URL不会变,menuName也不会变;而且URL还挺多的,数据量较大。最适合用缓存了)。

总结,拦截器做日志,比较依赖数据库,如果不想维护按钮权限,还得在显示菜单过滤按钮。AOP做日志,不那么依赖,而且生命周期内元数据不会变,更适合缓存。反正各有利弊吧,说到底,拦截器,AOP其实都一样,都是PROXY。

猜你喜欢

转载自cainiao1923.iteye.com/blog/2338145
今日推荐