shiro入门

目录

1. 权限概述

1.1 什么是权限

 1.2 认证概念

1.3 授权概念

2. shiro概述

2.1 shiro简介

2.2 核心组件

3. Shiro入门

3.1 身份认证

3.2 Realm

3.3 编码、散列算法 

3.4 身份授权

3.5 shiro默认过滤器


1. 权限概述

1.1 什么是权限

权限管理,一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权
的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。
\bullet 访问权限
一般表示你能做什么样的操作,或者能够访问那些资源。例如:给张三赋予“店铺主管”角色,“店铺主管”具有“查询员工”、“添加员工”、“修改员工”和“删除员工”权限。此时张三能够进入系统,则可以进行这些操作

 \bullet 数据权限

一般表示某些数据你是否属于你,或者属于你可以操作范围。例如:张三是"店铺主管"角色,他可以看他手下客服人员所有的服务的买家订单信息,他的手下只能看自己负责的订单信息

 1.2 认证概念

\bullet 什么是认证

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过
核对用户输入的用户名和密码,看其是否与系统中存储的该用户的用户名和密码一致,来判断用户身份是否正确。例如:密码登录,手机短信验证、三方授权等

\bullet 认证流程

\bullet 关键对象 

上边的流程图中需要理解以下关键对象:
Subject :主体:访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;
Principal :身份信息是主体( subject )进行身份认证的标识,标识必须具有唯一性,如用户名、
手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份( Primary Principal)。
credential :凭证信息:是只有主体自己知道的安全信息,如密码、证书等。

1.3 授权概念

\bullet 什么是授权

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后,系统会为其分配对应的权限,
当访问资源时,会校验其是否有访问此资源的权限。
这里首先理解 4 个对象:
        用户对象user :当前操作的用户、程序。
        资源对象resource :当前被访问的对象
        角色对象role :一组 " 权限操作许可权 " 的集合。
        权限对象permission :权限操作许可权

\bullet 授权流程

2. shiro概述

2.1 shiro简介

\bullet Shiro是 apache 旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
\bullet Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点:
        \circ 易于理解的 Java Security API
        \circ 简单的身份认证(登录),支持多种数据源(LDAP JDBC 等); · 对角色的简单的签权(访问控制),也支持细粒度的鉴权;
        \circ 支持一级缓存,以提升应用程序的性能;
        \circ 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
        \circ 异构客户端会话访问;
        \circ 非常简单的加密 API
        \circ 不跟任何的框架或者容器捆绑,可以独立运行。

2.2 核心组件

\bullet shiro架构图

 

\bullet subject

Subject主体,外部应用与subject进行交互,subject将用户作为当前操作的主体,这个主体:可以是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权

\bullet SecurityManager

SecurityManager权限管理器,它是shiro的核心,负责对所有的subject进行安全管理。通过
SecurityManager可以完成subject的认证、授权等,SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口

\bullet Authenticator

Authenticator即认证器,对用户登录时进行身份认证

\bullet Authorizer

Authorizer授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

\bullet Realm(数据库读取+认证功能+授权功能实现)

Realm领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据
比如:
如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。
注意:
不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

\bullet SessionManager

SessionManager会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

 \bullet SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口
比如:
        可以通过jdbc将会话存储到数据库
        也可以把session存储到缓存服务器

\bullet CacheManager

CacheManager缓存管理,将用户权限数据存储在缓存,这样可以提高性能

\bullet Cryptography

Cryptography 密码管理, shiro 提供了一套加密 / 解密的组件,方便开发。比如提供常用的散列、加 / 解密等功能

3. Shiro入门

3.1 身份认证

\bullet 基本流程

功能 流程如下:
1 Shiro 把用户的数据封装成标识 token token 一般封装着用户名,密码等信息
2 、使用 Subject 门面获取到封装着用户的数据的标识 token
3 Subject 把标识 token 交给 SecurityManager ,在 SecurityManager 安全中心中, SecurityManager
把标识 token 委托给认证器 Authenticator 进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm
4 、认证器 Authenticator 将传入的标识 token ,与数据源 Realm 对比,验证 token 是否合法

3.2 Realm

\bullet Realm接口

3.3 编码、散列算法 

\bullet 编码与解码

Shiro 提供了 base64 16 进制字符串编码 / 解码的 API 支持,方便一些编码解码操作。
Shiro 内部的一些数据的【存储 / 表示】都使用了 base64 16 进制字符串
\bullet  散列算法
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5 SHA 等。一般进行散列时最好提供一个 salt (盐),比如加密密码 “admin” ,产生的散列值是“21232f297a57a5a743894a0e4a801fc3” ,可以到一些 md5 解密网站很容易的通过散列值得到密码“admin” ,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如salt (即盐);这样散列的对象是 密码 +salt” ,这样生成的散列值相对来说更难破解。
shiro 支持的散列算法:Md2Hash、 Md5Hash Sha1Hash Sha256Hash Sha384Hash Sha512Hash

3.4 身份授权

\bullet 基本流程

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 中的枚举过滤器
\bullet  认证相关
过滤器
过滤器类
说明
默认
authc
FormAuthenticationFilter
基于表单的过滤器;如 “/**=authc” ,如果没有登录会跳到相应的登录
页面登录
无       
logout
LogoutFilter
退出过滤器,主要属性: redirectUrl :退出成功后重定向的地址,
“/logout=logout”
/
anon
AnonymousFilter
匿名过滤器,即不需要登录即可访问;一般用于静态资源过滤;示
“/static/**=anon”
\bullet  授权相关
过滤器过滤器类说明默认
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 拦截器一样;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值