1. 背景介绍
什么是权限管理?
权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。
权限管理体系几乎可以出现在任何系统里面,只要项目存在有用户和密码的相关概念。
很多人常将 “用户身份认证”、“密码加密”、“系统管理” 等概念与权限管理概念混淆。
权限管理就是管理用户对于资源的操作。
本 CRM 系统的权限(也称作资源)是基于角色操作权限来实现的,即 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。
简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成 “用户 - 角色 - 权限” 的授权模型。
在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系,为了实现表之间多对多的关系,必须将一个多对多的关系通过一个中间表分为两个一对多的关系。
因此引入中间表,用户角色表和角色权限表。
PRAC 模型: 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。
在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。 这就极大地简化了权限的管理。
在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。
角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。
2. 知识剖析
Shiro 架构
两条重要的英文
AuthorizationInfo: Authentication: 身份认证 / 登录,验证用户是不是拥有相应的身份;
AuthenticationInfo:Authorization: 授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,在解释它们前首先必须要描述一下 Shiro 对于安全用户的界定:和大多数操作系统一样。用户具有角色和权限两种最基本的属性。例如,我的 Windows 登陆名称是 learnhow,它的角色是 administrator,而 administrator 具有所有系统权限。这样 learnhow 自然就拥有了所有系统权限。那么其他人需要登录我的电脑怎么办,我可以开放一个 guest 角色,任何无法提供正确用户名与密码的未知用户都可以通过 guest 来登录,而系统对于 guest 角色开放的权限极其有限。同理,Shiro 对用户的约束也采用了这样的方式。AuthenticationInfo 代表了用户的角色信息集合,AuthorizationInfo 代表了角色的权限信息集合。如此一来,当设计人员对项目中的某一个 url 路径设置了只允许某个角色或具有某种权限才可以访问的控制约束的时候,Shiro 就可以通过以上两个对象来判断。
Subject: 主体,代表了当前 “用户”。
所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;
SecurityManager: 安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;
它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互
可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
Realm: 域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,
Session Manager: 会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;
Caching: 缓存,比如用户登录后,其用户信息、拥有的角色 / 权限不必每次去查,这样可以提高效率;
Remember Me: 记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的;
Cryptography: 加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
Concurrency: shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing: 提供测试支持;
Run As: 允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Web Support: Web 支持,可以非常容易的集成到 Web 环境;
3. 常见问题
1.Shiro 是使用 INI 文件来管理相关内容的,我不喜欢这样,要怎么做?
4. 解决方案
1、对象名 = 全限定类名 相对于调用 public 无参构造器创建对象
2、对象名. 属性名 = 值 相当于调用 setter 方法设置常量值
3、对象名. 属性名 =$ 对象引用 相当于调用 setter 方法设置对象引用
5. 编码实战
6. 扩展思考
7. 参考文献
链接地址:http://jinnianshilongnian.iteye.com/blog/2018936/
作者:张开涛
链接地址:https://www.sojson.com/blog/115.html
作者:散仙一枚
8. 更多讨论
1.shiro与spring security的优劣?
2.shiro如何集成redis.
需要根据需求,去实现或者集成shiro的相关接口。
第一件实现 Cache 接口。第二件实现 CacheManager 接口。然后修改配置文件即可。
3.shiro的使用场景有哪些?
基本上关于资源甚至是存在账户密码的项目,都可以是shiro的使用场景。比如腾讯会员。比如后台管理员。
--------------------------------------------------------------------------