您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Shiro框架详解

时间:2020-12-24 14:10:14  来源:  作者:

之间工作中曾经用到过shiro这个权限控制的框架,之前一直都是停留在用的方面,没有过多的 去理解这方面的知识,现在有时间,专门研究了一下这个Shiro权限的框架使用。

Shiro是什么?

Apache Shiro是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。

Apache Shiro的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。框架应该尽可能掩盖复杂的地方,露出一个干净而直观的API,来简化开发人员在使他们的应用程序安全上的努力。

因为很多时候很多人比较喜欢使用Spring提供的Spring Security和Shiro来进行对比,我们也对比一下这个内容。

Apache Shiro是JAVA的一个安全框架。

目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。

所以,我们工作中很多时候都是直接使用的Shiro来进行安全控制。

我们介绍完了之后,在看看Shiro有什么用处?

Shiro作用

  1. 验证用户来核实他们的身份
  2. 对用户执行访问控制

比如说我们可以用来判断一个用户是否被分配了一个安全的角色。然后来判断这个人到底在项目中能有什么权限来处理, 意思就是假如说有2个人,一个是管理员,他有增删改查的功能,而另外一个用户就是只又查的功能,没有增删改的功能, 通过Shiro来进行控制,就能达到这种效果。

我们可以看一下Apache官网上对Shiro,它都包含哪些功能。

Shiro框架详解

 

我们看看它每一个模块代表的是什么意思

Authentication:认证,有时也简称为“登录”,这是一个证明用户是他们所说的他们是谁的行为。

Authorization:授权,访问控制的过程,也就是绝对“谁”去访问“什么” 授权用于回答安全问题,例如“用户是否允许编辑帐户”,“该用户是否允许查看此网页”,“该用户是否可以访问”到这个按钮?“这些都是决定用户有权访问的决定,因此都代表授权检查。

Cryptography:密码术是通过隐藏信息或将其转换为无意义来保护信息免受不良访问的做法,因此没有其他人可以阅读它。Shiro专注于密码学的两个核心要素:使用公钥或私钥加密数据的密码,以及对密码等数据进行不可逆转加密的哈希(也称为消息摘要)。

Shiro Cryptography的主要目标是采用传统上非常复杂的领域,并在提供强大的密码学功能的同时使其他人轻松实现。

Session Management:Session会话,会话是您的用户在使用您的应用程序时携带一段时间的数据桶。传统上,会话专用于Web或EJB环境。不再!Shiro支持任何应用程序环境的会话。此外,Shiro还提供许多其他强大功能来帮助您管理会话。

Web Support:Shiro的web支持的API能够轻松地帮助保护 Web 应用程序。主要就是用来对Web程序进行一个好的支持的。

Caching:缓存,他是Apache Shiro中的第一层公民,来确保安全操作快速而又高效。

Concurrency:shiro利用它的并发特性来支持多线程应用程序

Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。

“Run As”:其实这个就是有是有允许一个用户假设为另外一个用户身份的功能,有时候在管理脚本的时候很有效果

Remember Me:在会话中记住用户的身份,所以他们只需要在强制时候登录。

Shiro核心

Shiro其实是有三大核心组件的,Subject、SecurityManager和Realms。

Subject:Subject实质上是一个当前执行用户的特定的安全“视图”。鉴于”User”一词通常意味着一个人,而一个Subject可以是一个人, 但它还可以代表第三方服务,daemon account,cron job,或其他类似的任何东西——基本上是当前正与软件进行交互的任何东西。 所有Subject实例都被绑定到(且这是必须的)一个SecurityManager上。当你与一个Subject交互时,那些交互作用转化为与SecurityManager交互的特定subject的交互作用。 我们可以把Subject认为是一个门面,SecurityManager才是真正的执行者。

SecurityManager:安全管理器,也就是说所有与安全有关的操作都会与SecurityManager进行交互,而且他管理这Subject,它其实是Shiro的核心 是Shiro架构的心脏。并作为一种“保护伞”对象来协调内部的安全组件共同构成一个对象图。

Realms: 域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

当配置Shiro时,你必须指定至少一个Realm用来进行身份验证和/或授权。SecurityManager可能配置多个Realms,但至少有一个是必须的。

Shiro框架详解

 

我们可以通过一个简单的登录来看shiro对权限的控制。

我们就通过图解来理解一下,然后写个简单的代码

Shiro框架详解

 

上图是对shiro角色权限的设计

而接下来我们就可以看一下它具体的登录图解了

Shiro框架详解

 

我解释一下这个图。

1、登陆操作 携带用户名密码给subject,subject调用自己的登陆方法传递用户名和密码给权限管理器,权限管理器将用户名密码传递给开发人员编写的realm的认证方法,realm根据用户名到数据库中查找是否存在该用户,若存在将认证信息存入到session中

 
 /*
 * 参数1:登陆标识
 * 参数2:正确的密码
 * 参数3:认证|授权器的名字
 */
 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
 

2、权限管理器会自动判断传递的密码与正确密码是否一致

3、访问3类资源(页面) 过滤器寻找权限管理器判断该用户是否拥有xxx权限,权限管理器从session中取出认证信息对象,返回给realm,realm判断该用户拥有什么权限,封装到授权信息中返回给权限管理器,权限管理器将判断的结果返回给过滤器

4、访问3类资源(xxx添加需要访问service)(对于过滤器来说属于2类资源),在执行方法时,会到达前置通知(esrvice方法上添加注解@RequiresPermissions(“courier:list”)),权限通知寻找权限管理器判断该用户是否拥有xxx权限,权限管理器从session中取出认证信息对象,返回给realm,realm判断该用户拥有什么权限,封装到授权信息中返回给权限管理器,权限管理器将判断的结果返回给权限通知

其实简单来说 /userAction_login ———->请求先到达权限过滤器shiroFilter,先判断是几类资源

登录属于一类资源直接放行到————>userActon中(userAction中调用执行subject对象(使用入口是一个操作入口对象,里面有登陆方法,登出方法,获取当前对象方法)的登陆方法subject.login方法(携带着用户名,密码)

————>subject对象调用 securityManager的login方法 权限管理器不能判断用户和密码是对的需要

————>ream认证授权器(开发人员编写,判断用户名是否存在,拥有什么权限)————>处理完后把认证信息对象返回给securityManager()如果认证信息没有问题,权限管理器会把认证信息存入session(证明认证登陆过了)

可以自定义一个Realm;


@Service("MyRealm")
public class MyRealm extends AuthorizingRealm{ //父类接口Realm
	
	@Autowired
	private UserDao ud;
	
	@Autowired
	private RoleService rs;
	
	@Autowired
	private PermissionService ps;

	@Override
	//授权
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		User user = (User) principals.getPrimaryPrincipal();
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		List<Role> roles = rs.findByUser(user);
		if(roles != null && roles.size() > 0){
			for (Role role : roles) {
				info.addRole(role.getKeyword());
			}
		}
		List<Permission> permissions = ps.findByUser(user);
		if(permissions != null && permissions.size() > 0) {
			for (Permission permission : permissions) {
				info.addStringPermission(permission.getKeyword());
			}
		}
		return info;
	}

	@Override
	//认证
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken t) throws AuthenticationException {
		UsernamePasswordToken token = (UsernamePasswordToken) t;
		String username = token.getUsername();
		User user = ud.findByUsername(username);
		if(user != null){
			/*
			 * 参数1:登陆标识
			 * 参数2:正确的密码
			 * 参数3:认证|授权器的名字
			 */
			SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());
			//ActionContext.getContext().getSession().put("loginUser", user);
			return info;
		} else {
			return null;
		}
		
	}

}


登陆完以后访问页面资源(页面资源属于三类资源需要权限),

shiroFilter(已经配置了哪些资源是一类哪些资源是三类)

————>访问权限管理器,找权限管理器判断是否有xxx权限(权限管理器本身不能做出判断),权限管理器把之前登陆时保存在session中的认证信息取出

交给————>realm判断(realm中认证方法是登陆时候调用的),realm查询数据库获得权限,把权限信息返还给————>权限管理器。

权限管理器根据realm的授权信息判断是否拥有xxx权限, 判断后把结果通知给————>权限管理器,权限管理器ShiraFilter 如果没有权限跳转到响应页面。

这其实就是一个简单的shiro框架的设计,可能个人设计的有点小毛病,只是一个测试,大家自行体会

总结

Shiro是一个功能很齐全的框架,使用起来也很容易,总结一下 三大核心内容:

  1. Subject
  2. SecurityManager
  3. Realms

Shiro 功能强大、且 简单、灵活。是Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行

所以这个权限控制框架,大家理解了么?有想法的咱们可以共同交流一下。



Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说到远程控制,首先你会想到的是什么?是TeamViewer 还是向日葵?抑或是QQ远程还是anydesk?对,就在不久前,我们熟知的都是以上的产品,但是只2020年开始,一款新的远控产品ToDesk进入到我...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
就在今天,腾讯方面宣布将在2022年1月31日下架企业QQ和营销QQ,其实这一消息的降临并不让笔者意外,因为早在今年的10月28日20点之后,企业QQ和营销QQ就被停止了续费服务。相信很多...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(3)  评论:(0)  加入收藏
一、前言有朋友问:怎么才能让Windows电脑与iPhone方便的交换文件,我的解决方案是:利用Documents By Readdle 来完成Windows 11 与 iPhone / iPad 互传文件。苹果电脑与手机间通...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
果粉之家,专业苹果手机技术研究十年!您身边的苹果专家~近日,网上突然出现一则 iPhone 信号问题只需10块钱就能解决的传言,引起了小编(果粉之家)的特别关注。而根据网友表示,手机只...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
这是很久以前的一则数据,我在iOS平台开发了“先知 - 优质生活”App,本想依靠封闭式环境,广告少体验不错等优点。会有一定的下载量,没想到开发完成后,就被App store埋藏起来了。个...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(2)  评论:(0)  加入收藏
个人所得税递延纳税报告【业务概述】自然人符合规定条件的,可以申请个人所得税递延纳税,主要包括以下情形:1.非上市公司股权激励个人所得税递延纳税备案非上市公司授予本公司员...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(2)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
20年前,等离子电视凭借过硬的技术和显示效果,深受大众喜爱,人们也常说“外行买液晶,内行选等离子”,可见等离子电视在人们心中的地位不一般。现如今,大数据告诉我们,技术过硬不代表...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
  1、明确产品的需求分析+功能  这是最基本的也是第一步,我们要明确自己或者客户真的想要开发一款app应用,其次就要了解到底要开发什么功能什么类别和种类的app应用。所...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  Tags: Shiro框架  点击:(1)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条