为什么需要权限管理?
- 安全性:防止误操作、人为破坏、数据泄露。
- 数据隔离:不同的权限能看到的以及操作的数据不同
- 明确职责:不同的角色所做的操作和所看到的数据不同
权限管理的核心是什么?
- 用户-权限:
人员少,功能固定,或者特别简单的系统。比如 MySQL 就是属于这种权限管理模式 - RBAC(Role-Based Access Control):
基于角色的权限访问控制。在 RBAC 中权限与角色相关联,用户绑定所对应的角色从而得到这些角色的权限,这种关联简化了权限的管理。
在一个组织中,角色是为了完成某种工作而创造出来的,用户则依据他的责任和资格赋予相应的角色。并且,用户也可以很容易的从 A 角色切换成 B 角色。角色可以根据新的需求和系统的合并来赋予新的权限。权限也可以从某个角色中回收。
RBAC 模型主要关注于 角色-用户-权限之间的关系,角色和用户是多对多的关系,角色和权限是多对多的关系。
如果现实中,有很多人都有相同的权限,RBAC 可以拓展出 group 这个概念的,group 是可以解决多角色相同权限的问题,比如:A 部门的资料,只能 A 部门的人员看,那么用户的账号就直接赋予 A 部门这个角色组就好了。
RBAC 模型还支持著名的三大安全原则:最小权限原则、责任分离原则、数据抽象原则。
理想中的权限管理?
- 实现角色级的权限管理:
角色级的权限管理都是基于 RBAC 模型实现的。这种模型几乎能覆盖所有场景,同时能够满足需求的不断变化,许多临时的调整也能很好的应对。基于 RBAC 的权限的管理,很好的完成了对权限的抽象,只需要根据不同的场景进行不同的实现就好。相对于直接对用户绑定权限,RBAC 可以对用户进行更好的扩展。 - 可实现功能级、数据级权限:
功能级权限就是功能权限管理技术,一般就使用 RBAC 权限管理模型。功能级权限管理系统会提供如下功能:
1、角色管理系统由用户定义角色赋予权限;
2、用户角色管理界面,由用户给系统用户赋予角色;
3、支持用户定义权限。
目前数据级权限管理没有统一的技术,大体上采用的是如下技术:
1、硬编码,这种情况居多,但是弊端非常显然,耦合性高,不易测试,不易维护;
2、使用规则引擎,有一些企业将这种逻辑用规则的形式体现出来。这可以解决很多问题,但是规则引擎并不是专业用于权限管理,所以对于一些复杂的权限管理就显得力不从心了;
3、使用第三方专业软件。 - 简单易操作,能够实现各种需求:
所有涉及到权限相关的都能有相关的页面可操作,同时能提供一个页面能查询到一个用户当前的权限列表。需要的页面如下:
1、权限管理界面;
2、角色管理界面;
3、用户管理界面;
4、角色和权限关系维护界面;
5、用户和角色关系维护界面。
开源的权限管理项目
- Spring Security:
是一个能够为基于 Spring 的企业应用系统,提供声明式的安全控制解决方案的安全框架。
它提供了一组可以在 Spring 应用上下文配置的 Bean,充分利用了 Spring 控制反转、依赖注入和面向切面编程功能。对已有系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。 - Apache Shiro:
Shiro 是一个强大且易用的 Java 安全框架,执行身份验证、授权、密码学和会话管理。Shiro 有易于理解的 API。