之前介绍过权限模型和访问控制,我们做的项目就是基于通用权限模型和基于资源的访问控制,而且从总体上是实现了粗粒度的权限管理,但是根据不同的需求也实现了细粒度的权限管理。目前所有资源都是具有url的,也可以说我们的资源就是一堆有规则的url,这样无论是我们从springMVC拦截还是url的拦截,只要url具有一定的规则,那拦截起来就很好实现。那么,什么是粗粒度和细粒度权限呢。
粗粒度和细粒度权限
粗粒度权限管理,对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、类方法、页面中按钮。粗粒度权限管理比如:超级管理员可以访问户添加页面、用户信息等全部页面。部门管理员可以访问用户信息页面包括页面中所有按钮。
细粒度权限管理,对资源实例的权限管理。资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息、行政部的员工。细粒度权限管理就是数据级别的权限管理。细粒度权限管理比如:部门经理只可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。。
粗粒度和细粒度例子:
系统有一个用户列表查询页面,对用户列表查询分权限,如果粗颗粒管理,张三和李四都有用户列表查询的权限,张三和李四都可以访问用户列表查询。
进一步进行细颗粒管理,张三(行政部)和李四(开发部)只可以查询自己本部门的用户信息。张三只能查看行政部 的用户信息,李四只能查看开发部门的用户信息。细粒度权限管理就是数据级别的权限管理。
如何实现粗粒度和细粒度权限管理
粗粒度
粗粒度权限管理比较容易将权限管理的代码抽取出来在系统架构级别统一处理。比如:通过springmvc的拦截器实现授权。
细粒度
对细粒度权限管理在数据级别是没有共性可言,针对细粒度权限管理就是系统业务逻辑的一部分,如果在业务层去处理相对比较简单,如果将细粒度权限管理统一在系统架构级别去抽取,比较困难,即使抽取的功能可能也存在扩展不强。建议细粒度权限管理在业务层去控制。比如:部门经理只查询本部门员工信息,在service接口提供一个部门id的参数,controller中根据当前用户的信息得到该用户属于哪个部门,调用service时将部门id传入service,实现该用户只查询本部门的员工。
ITOO中粗粒度和细粒度权限应用
粗粒度
通过角色控制门户显示各子系统资源,高校平台教学秘书进入考试系统可以使用考试配置等资源,学生角色进入考试系统只可进行考试和查询成绩。
细粒度
权限中给不同用户分配角色,左侧用户树,通过细粒度控制不同角色进入系统只能看到相应人员所在的机构下的所有人员,并不能看到其他机构的人。
不管是用粗粒度还是细粒度来实现权限管理,根据不同的业务需要即可,并没有明确的界限。