背景
因项目需要做比较详细的权限控制,大致了解了sprin sercurity、shiro两个名气比较大的权限管理框架。
得到的结论是:功能足够强大,用户、权限、认证等等,你想到的它全都有,没想到的也有。但是我并不需要这么多功能(项目的用户认证已由其他方案完成,现只需要权限控制)。而且连号称轻量级的shiro我也觉得太庞大了些。因此,决定根据项目需求自己实现一套极简权限控制方案。
关于权限的数据库表
表结构不是本文重点,简单提一下。与权限相关的表:
- 用户表
- 角色表
- 权限表(非必要,除非要做细粒度、可配置)
- 用户角色表
- 角色权限表
基于接口的权限控制
如何实现控制
- 根据当前session提供的用户信息,查询到该用户的角色
- 通过反射获取到当前访问的接口的注解,用注解里面的值去与数据库中该用户角色的权限集合(可以缓存)比对,有权限则通过,否则拒绝。
为什么要基于controller
客户端与服务端的交互是以http请求为单位的,所以基于请求进行权限控制是比较合理的选择。
实现
写一个注解类
/**
* 权限控制注解。
* @author yangsheng
* @Date 2019/8/1 14:08
*/
@Target(ElementT