概念
- 粗粒度:对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、类方法、页面中按钮。比如:超级管理员可以访问户添加页面、用户信息等全部页面;部门管理员可以访问用户信息页面包括页面中所有按钮。
- 细粒度:对资源实例的权限管理。资源实例是资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息、行政部的员工。
细粒度权限管理是数据级别的权限管理。比如:部门经理只可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。
粗粒度和细粒度例子
系统有一个用户列表查询页面,对用户列表查询分权限。
- 粗颗粒管理下:张三和李四都有用户列表查询的权限,张三和李四都可以访问用户列表查询。
- 细颗粒管理下:张三(行政部)和李四(开发部)只可以查询自己本部门的用户信息。张三只能查看行政部 的用户信息,李四只能查看开发部门的用户信息。
技术实现
原理
-
实现粗粒度权限管理
粗粒度权限管理比较容易将权限管理的代码抽取出来在系统架构级别统一处理。比如:通过springmvc的拦截器实现授权。 -
实现细粒度权限管理
细粒度权限管理在数据级别没有共性可言。细粒度权限管理是系统业务逻辑的一部分,如果在业务层去处理相对比较简单,如果将细粒度权限管理统一在系统架构级别去抽取,比较困难,即抽取的功能可能也存在扩展不强的缺点。
建议细粒度权限管理在业务层去控制。比如:部门经理只查询本部门员工信息,在service接口提供一个部门id的参数,controller中根据当前用户的信息得到该用户属于哪个部门,调用service时将部门id传入service,实现该用户只查询本部门的员工。
具体实现
- 基于url拦截的方式实现
基于url拦截的方式实现权限管理是在实际开发中比较常用的一种方式。对于web系统,通过filter过虑器实现url拦截,也可以使用springmvc的拦截器实现基于url的拦截。 - 使用权限管理框架实现
对于细粒度权限管理,建议使用优秀权限管理框架来实现,节省开发成功,提高开发效率。比较常见的权限管理框架有:SpringSecurity和Shiro。