目录
1. 权限概述
1.1 什么是权限
权限管理,一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权
的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。
一般表示你能做什么样的操作,或者能够访问那些资源。例如:给张三赋予“店铺主管”角色,“店铺主管”具有“查询员工”、“添加员工”、“修改员工”和“删除员工”权限。此时张三能够进入系统,则可以进行这些操作
数据权限
一般表示某些数据你是否属于你,或者属于你可以操作范围。例如:张三是"店铺主管"角色,他可以看他手下客服人员所有的服务的买家订单信息,他的手下只能看自己负责的订单信息
1.2 认证概念
什么是认证
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过
核对用户输入的用户名和密码,看其是否与系统中存储的该用户的用户名和密码一致,来判断用户身份是否正确。例如:密码登录,手机短信验证、三方授权等
认证流程
关键对象
上边的流程图中需要理解以下关键对象:
Subject
:主体:访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;
Principal
:身份信息是主体(
subject
)进行身份认证的标识,标识必须具有唯一性,如用户名、
手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(
Primary Principal)。
credential
:凭证信息:是只有主体自己知道的安全信息,如密码、证书等。
1.3 授权概念
什么是授权
授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后,系统会为其分配对应的权限,
当访问资源时,会校验其是否有访问此资源的权限。
这里首先理解
4
个对象:
用户对象user
:当前操作的用户、程序。
资源对象resource
:当前被访问的对象
角色对象role
:一组
"
权限操作许可权
"
的集合。
权限对象permission
:权限操作许可权
授权流程
2. shiro概述
2.1 shiro简介
2.2 核心组件
shiro架构图
subject
Subject主体,外部应用与subject进行交互,subject将用户作为当前操作的主体,这个主体:可以是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权
SecurityManager
SecurityManager权限管理器,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口
Authenticator
Authenticator即认证器,对用户登录时进行身份认证
Authorizer
Authorizer授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。
Realm(数据库读取+认证功能+授权功能实现)
Realm领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。
SessionManager
SessionManager会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
SessionDAO
SessionDAO即会话dao,是对session会话操作的一套接口比如:可以通过jdbc将会话存储到数据库也可以把session存储到缓存服务器
CacheManager
CacheManager缓存管理,将用户权限数据存储在缓存,这样可以提高性能
Cryptography
Cryptography 密码管理, shiro 提供了一套加密 / 解密的组件,方便开发。比如提供常用的散列、加 / 解密等功能
3. Shiro入门
3.1 身份认证
基本流程
功能
流程如下:
1
、
Shiro
把用户的数据封装成标识
token
,
token
一般封装着用户名,密码等信息
2
、使用
Subject
门面获取到封装着用户的数据的标识
token
3
、
Subject
把标识
token
交给
SecurityManager
,在
SecurityManager
安全中心中,
SecurityManager
把标识
token
委托给认证器
Authenticator
进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm
4
、认证器
Authenticator
将传入的标识
token
,与数据源
Realm
对比,验证
token
是否合法
3.2 Realm
Realm接口
3.3 编码、散列算法
编码与解码
Shiro
提供了
base64
和
16
进制字符串编码
/
解码的
API
支持,方便一些编码解码操作。
Shiro
内部的一些数据的【存储
/
表示】都使用了
base64
和
16
进制字符串
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5
、
SHA
等。一般进行散列时最好提供一个
salt
(盐),比如加密密码
“admin”
,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”
,可以到一些
md5
解密网站很容易的通过散列值得到密码“admin”
,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如salt
(即盐);这样散列的对象是
“
密码
+salt”
,这样生成的散列值相对来说更难破解。
shiro
支持的散列算法:Md2Hash、
Md5Hash
、
Sha1Hash
、
Sha256Hash
、
Sha384Hash
、
Sha512Hash
3.4 身份授权
基本流程
1
、首先调用
Subject.isPermitted/hasRole
接口,其会委托给
SecurityManager。
2
、
SecurityManager
接着会委托给内部组件
Authorizer
;
3
、
Authorizer
再将其请求委托给我们的
Realm
去做;
Realm
才是真正干活的;
4
、
Realm
将用户请求的参数封装成权限对象。再从我们重写的
doGetAuthorizationInfo
方法中获取从数据库中查询到的权限集合。
5
、
Realm
将用户传入的权限对象,与从数据库中查出来的权限对象,进行一一对比。如果用户传入的权限对象在从数据库中查出来的权限对象中,则返回true
,否则返回
false
。
进行授权操作的前提:用户必须通过认证
3.5 shiro默认过滤器
Shiro
内置了很多默认的过滤器,比如身份验证、授权等相关的。默认过滤器可以参考
org.apache.shiro.web.filter.mgt.DefaultFilter
中的枚举过滤器
过滤器
|
过滤器类
|
说明
| 默认 |
authc
|
FormAuthenticationFilter
|
基于表单的过滤器;如
“/**=authc”
,如果没有登录会跳到相应的登录
页面登录
| 无 |
logout
|
LogoutFilter
|
退出过滤器,主要属性:
redirectUrl
:退出成功后重定向的地址,
如
“/logout=logout”
| / |
anon
|
AnonymousFilter
|
匿名过滤器,即不需要登录即可访问;一般用于静态资源过滤;示
例
“/static/**=anon”
| 无 |
过滤器 | 过滤器类 | 说明 | 默认 |
roles
|
RolesAuthorizationFilter
|
角色授权拦截器,验证用户是否拥有所有角色;主要属性:
loginUrl
:登录页面地址(
/login.jsp
);
unauthorizedUrl
:未授权后重定向的地址;示
例
“/admin/**=roles[admin]”
| 无 |
perms
|
PermissionsAuthorizationFilter
|
权限授权拦截器,验证用户是否拥有所有权限;属性和
roles
一样;示例
“/user/**=perms["user:create"]”
| 无 |
port
|
PortFilter
|
端口拦截器,主要属性:
port
(
80
):可以通过的端口;示例
“/test= port[80]”
,如果用户访问该页面是非
80
,将自动将请求端口改为
80
并重定向到该
80
端口,其他
路径
/
参数等都一样
| 无 |
rest
|
HttpMethodPermissionFilter
|
rest
风格拦截器,自动根据请求方法构建权限字符串(
GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read,
MKCOL=create
)构建权限字符串;示例
“/users=rest[user]”
,会自动拼出
“user:read,user:create,user:update,user:delete”
权限字符串进行权限匹配(所有都得匹
配,
isPermittedAll
)
| 无 |
ssl
|
SslFilter
|
SSL
拦截器,只有请求协议是
https
才能通过;否则自动跳转会
https
端口(
443
);其他和
port
拦截器一样;
| 无 |