Shiro简介

目录

  • 1. shiro简介
  • 2. shiro优势
  • 3. 核心概念
    • 3.1 Subject
    • 3.2 SecurityManager
    • 3.3 Realm
    • 3.4 工作原理示意图
  • 4. 典型安全场景
    • 4.1 认证
    • 4.2 授权
  • 5. shiro与web集成
    • 5.1 集成
    • 5.2 url过滤器

1. shiro简介

shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。

应用场景:

  1. 在独立应用中使用
  2. 在web中使用
  3. 在spring框架中集成。

shiro 解决应用安全的四要素:

  • 认证 - 用户身份识别,常被称为用户“登录”
  • 授权 - 访问控制
  • 密码加密 - 保护或隐藏数据防止被偷窥
  • 会话管理 - 与用户相关的时间敏感的数据

2. shiro优势

  • 易用: 相当于其他安全框架,shiro比较简单易用
  • 广泛: 使用非常广泛,资料好找
  • 灵活: 可以工作在很多工作环境,web,ejb,ioc等等
  • web支持: 对web的支持好,允许你基于应用 URL 和 Web 协议(如 REST)创建灵活的安全策略,同时还提供了一套控制页面输出的 JSP 标签库
  • 支持:应用广泛,是 Apache 软件基金会成员

3. 核心概念

Shiro的核心概念有三个:Subject,SecurityManager 和 Realms。

3.1 Subject

subject 被Shiro 描述为一个主体,这个主要可以是具体的用户(即:人),可以是一个系统,例如:我们开发的系统需要通过支付宝支付,那么系统对于支付宝来说就是一个主体。所以主体是一个抽象的概念。

在考虑安全时,最常考虑的两个问题,1)当前用户是谁(即,认证) 2)当前用户能被允许做什么?(即:授权)。
考虑应用安全的最自然方式就是基于当前用户。Shiro 的 API 用它的 Subject 概念从根本上体现了这种思考方式

在应用系统中,使用shiro可以方便的获取当前操作的主体:

//获取当前主体
Subject currentUser =SecurityUtils.getSubject();

//判断主体是否具有指定角色。
subject.hasRole("administrator")

在获取到Subject后,通过这个对象,可以对其执行绝大多数的安全操作:登录,退出,执行授权检查等。

Shiro 的api非常直观,它反映了开发者以“每个用户” 思考安全控制的自然趋势

3.2 SecurityManager

如果说Subject关注当前用户的安全操作,SecurityManager则管理所有用户的安全操作。

SecurityManager 是 Shiro 框架的核心,充当“保护伞”引用了多个内部嵌套安全组件,它们形成了对象图。但是,一旦 SecurityManager 及其内部对象图配置好,它就会退居幕后,应用开发人员几乎把他们的所有时间都花在 Subject API 调用上。

一个应用只需要一个 SecurityManager,是一个单例对象。缺省实现是POJO,可以用POJO兼容的任何配置机制进行配置:普通的Java代码、Spring xml、YAML、和 ini 文件等。

SecurityManager是通过java代码或配置文件生成,用来管理所有用户的安全操作的对象,是单例的。

以ini配置文件为例:

// 1.装入 INI 配置
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

//2. 创建 SecurityManager
SecurityManager securityManager = factory.getInstance();

//3. 使其可访问
SecurityUtils.setSecurityManager(securityManager);

3.3 Realm

Realm 充当了 Shiro 与应用安全数据间的“桥梁”或者“连接器"。
从某种意义上讲,Realm 实际上就是一个安全相关的 DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给 Shiro。 Shiro 内置了一些Realm ,支持多种数据源的连接,如JDBC、LDAP、INI文件的连接等。另外,可以自定义Realm 实现,方便个性化的应用场景。

3.4 工作原理示意图

目录

  • 1. shiro简介
  • 2. shiro优势
  • 3. 核心概念
    • 3.1 Subject
    • 3.2 SecurityManager
    • 3.3 Realm
    • 3.4 工作原理示意图
  • 4. 典型安全场景
    • 4.1 认证
    • 4.2 授权
  • 5. shiro与web集成
    • 5.1 集成
    • 5.2 url过滤器

1. shiro简介

shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。

应用场景:

  1. 在独立应用中使用
  2. 在web中使用
  3. 在spring框架中集成。

shiro 解决应用安全的四要素:

  • 认证 - 用户身份识别,常被称为用户“登录”
  • 授权 - 访问控制
  • 密码加密 - 保护或隐藏数据防止被偷窥
  • 会话管理 - 与用户相关的时间敏感的数据

2. shiro优势

  • 易用: 相当于其他安全框架,shiro比较简单易用
  • 广泛: 使用非常广泛,资料好找
  • 灵活: 可以工作在很多工作环境,web,ejb,ioc等等
  • web支持: 对web的支持好,允许你基于应用 URL 和 Web 协议(如 REST)创建灵活的安全策略,同时还提供了一套控制页面输出的 JSP 标签库
  • 支持:应用广泛,是 Apache 软件基金会成员

3. 核心概念

Shiro的核心概念有三个:Subject,SecurityManager 和 Realms。

3.1 Subject

subject 被Shiro 描述为一个主体,这个主要可以是具体的用户(即:人),可以是一个系统,例如:我们开发的系统需要通过支付宝支付,那么系统对于支付宝来说就是一个主体。所以主体是一个抽象的概念。

在考虑安全时,最常考虑的两个问题,1)当前用户是谁(即,认证) 2)当前用户能被允许做什么?(即:授权)。
考虑应用安全的最自然方式就是基于当前用户。Shiro 的 API 用它的 Subject 概念从根本上体现了这种思考方式

在应用系统中,使用shiro可以方便的获取当前操作的主体:

//获取当前主体
Subject currentUser =SecurityUtils.getSubject();

//判断主体是否具有指定角色。
subject.hasRole("administrator")

在获取到Subject后,通过这个对象,可以对其执行绝大多数的安全操作:登录,退出,执行授权检查等。

Shiro 的api非常直观,它反映了开发者以“每个用户” 思考安全控制的自然趋势

3.2 SecurityManager

如果说Subject关注当前用户的安全操作,SecurityManager则管理所有用户的安全操作。

SecurityManager 是 Shiro 框架的核心,充当“保护伞”引用了多个内部嵌套安全组件,它们形成了对象图。但是,一旦 SecurityManager 及其内部对象图配置好,它就会退居幕后,应用开发人员几乎把他们的所有时间都花在 Subject API 调用上。

一个应用只需要一个 SecurityManager,是一个单例对象。缺省实现是POJO,可以用POJO兼容的任何配置机制进行配置:普通的Java代码、Spring xml、YAML、和 ini 文件等。

SecurityManager是通过java代码或配置文件生成,用来管理所有用户的安全操作的对象,是单例的。

以ini配置文件为例:

// 1.装入 INI 配置
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

//2. 创建 SecurityManager
SecurityManager securityManager = factory.getInstance();

//3. 使其可访问
SecurityUtils.setSecurityManager(securityManager);

3.3 Realm

Realm 充当了 Shiro 与应用安全数据间的“桥梁”或者“连接器"。
从某种意义上讲,Realm 实际上就是一个安全相关的 DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给 Shiro。 Shiro 内置了一些Realm ,支持多种数据源的连接,如JDBC、LDAP、INI文件的连接等。另外,可以自定义Realm 实现,方便个性化的应用场景。

3.4 工作原理示意图

 

shiro用户认证时序图:

shiro访问授权时序图

 

注:
subject: 提供针对具体用户的执行安全操作
SecurityManager: 配置所有用户的安全规则
Realm: 为SecurityManager提供数据源,这个数据源可以是配置文件,数据库,或第三方系统(例如需要使用QQ账号进行认证登录,则QQ为第三方系统,一般通过接口提供认证功能)

4. 典型安全场景

4.1 认证

一般的web应用认证就是指登录功能(占了大部分),也就是说,当用户使用应用进行认证时,他们就在证明他们就是自己所说的那个人(证明我是谁)。

认证典型的三个步骤:
1)获取用户信息,作为当事人的身份证明依据,shiro中称之为证书
2)将身份证明依据提交系统
3)如果身份证明有效则通过认证,否则认证失败。

注: 示例demo,随课件提供的shiro01,单元测试部分 test1。

4.2 授权

授权实质上就是访问控制, 控制已认证的用户能够访问应用的哪些资源。
多数用户执行访问控制是通过 角色 + 权限 的概念来完成的。角色是所有用户个体的一个分组,如管理员、普通用户、商家等;而权限 则表示具体能够操作的行为,比如查询所有用户、删除某些用户、修改信息等等,是与具体应用资源直接挂钩的。

用户 ---> 角色 ---> 权限

用户、角色、权限三者之间一般通过角色进行连接,用户和权限之间不直接绑定。

 

 

 

注: 示例demo,随课件提供的shiro01,单元测试部分 test2演

示判断角色,test3演示判断权限。
用户角色: 用户名=密码,角色1,角色2
角色权限: 角色=资源标识:操作 或者 角色=资源标识:操作:对象实例ID

5. shiro与web集成

5.1 集成

1)配置文件shiro-web.ini
2)通过监听器EnvironmentLoaderListener读取配置文件,来创建相应的WebEnvironment

可通过shiroConfigLocations参数,指定shiro的配置文件
shiroConfigLocations 默认是“/WEB-INF/shiro.ini”IniWebEnvironment默认是先从/ WEB-INF/shiro.ini加载, 如果没有就默认加载 classpath:shiro.ini。

3) 配置过滤器,放在web.xml的最前面。该过滤器拦截所有的请求进行安全验证。

5.2 url过滤器

shiro通过url过滤器链功能支持特定的过滤规则。示例:

[urls]
/assets/** = anon
/user/signup = anon
/user/** = user
/rpc/rest/** = perms[rpc:invoke], authc
/** = authc

对于每一行,等号左边的值表示相对上下文的 Web 应用路径。等号右边的值定义了过滤器链 - 一个逗号分隔的有序 Servlet 过滤器列表,它会针对给出的路径进行执行。
shiro内置的安全过滤器:

过滤器示例作用
anon/admins/**=anon表示可以匿名使用,如登录页面
authc/admins/user/**=authc表示需要认证才可使用
roles/admins/user/**=roles[admin]参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法
perms/admins/user/**=perms[user:add:*]perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:,user:modify:"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法
rest/admins/user/**=rest[user]根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等
authcBasic/admins/user/**=authcBasic没有参数表示httpBasic认证
过滤器实现类
anonorg.apache.shiro.web.filter.authc.AnonymousFilter
authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值