什么是Shiro
Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。
什么是权限管理
权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.
注意:权限管理包括用户认证和授权两部分.
用户认证
用户去访问系统,系统要验证用户身份的合法性.比如用户名密码 指纹打卡机等. 当我们通过用户名密码成功登录(用户认证通过),用户才能访问系统资源.
用户认证流程
用户认证时用到的关键对象
Subject(主体) 我们可以理解为用户或程序
例如:
用户:用户直接操作我们的系统
程序:我们通过远程接口调用我们的系统.
所以只要访问系统资源的我们都将它称为主体,系统都需要对主体进行身份认证.
principals(身份信息)
通常是唯一的,但是一个主体可以有多个身份信息.
注意:不管一个主体有几个身份信息, 这个主体都必须有一个身份信息.
credentials(凭证信息)
只有主体知道的安全值,如密码 / 数字证书等
总结: 主体在进行身份认证时需要提供身份信息和主体信息.
用户授权
当我们用户认证通过(例如通过用户名密码登录系统), 系统再判断你是不是有访问这个资源权限.如果有权限才能访问.
用户授权流程
用户授权时用到的关键对象
授权的过程理解为: who 对 what(which) 进行 how 操作.
who: 主体即主体,主体在认证通过后系统进行访问控制.
what(which): 资源(Resource) ,主体必须具备资源的访问权限才能访问资源.比如:系统用户列表页面,商品修改菜单,商品ID为001的商品信息.
how: 权限(permission), 针对资源的权限或许可, 主体必须具有对应的权限才能访问资源.比如: 用户添加,用户修改 商品删除.
分配权限
用户需要分配相应的权限才可访问相应的组员.权限是对资源的操作许可.
通常给用户分配资源权限需要将权限信息持久化.比如存储在关系数据库中.
权限模型
上图常被称为权限管理的通用模型,不过企业在开发中根据系统自身的特点还会对上图进行修改,但是用户、角色、权限、用户角色关系、角色权限关系是需要去理解的。
权限控制
基于角色的访问控制
系统角色包括: 部门经理 总经理等,角色对用户来划分.
系统代码中实现:
//如果 user是部门经理才能访问if中的代码
if(user.hasRole("部门经理")){
//系统资源内容
}
这样做大家可以想一下,如果我们在添加一种角色可以访问我们的某个资源.例如总经理和部门经理都能查看用户报表,那么就需要将代码改为如下
if(user.hasRole("部门经理") || user.hasRole("总经理")){
//系统资源内容
//用户报表
}
基于权限的访问控制
还是用访问报表来说,当用户有访问报表的权限的时候才能访问报表,这时代码改成如下.
if(user.hasPermission("查看报表权限")){
//系统资源内容
//用户报表
}
使用这种方法就可以解决我们上边的问题,例如现在财务也需要查看用户报表,如果使用角色访问控制的话我们就需要修改代码,而是用权限控制的话,我们只需要给财务这个角色分配一个查看报表的权限就可以了,而不需要改代码.
Shiro框架图
看最上面一层有c++ 和c#等语言,但是他们都是subject。
subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证和授权。
securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。
authenticator:认证器,主体进行认证最终是通过authenticator进行的。
authorizer:授权器,主体进行授权最终通过authorizer进行的。
sessionManager:web应用中一般是用web容器进行session管理,但是shiro也提供了一套session管理的机制方式。
有人可能会问直接用web容器的不就好了吗?为什么要自己提供呢?
答:因为 shiro 不仅可以应用于 web 系统还可以用于 c/s 系统,分布式系统等.
与 sessionManager 对应的有一个 sessionDao用于管理 session 数据.
cacheManager: 缓存管理器,主要对 session 和授权数据进行缓存.比如将授权数据通过 caheManager 进行缓存管理, 可以和 ehcache 整合进行缓存管理.
realm: 领域, 相当于数据源, 通过 realm 存取认证 授权相关数据.
注意:realm中存在认证和授权的逻辑,因为authenticator和authorizer是接口,有一些默认实现,这些默认实现最终都会调用 realm.
cryptograph: 提供了一套加密/解密的组件.