shiro初步学习

文章目录

    • 一、 Shiro 简介
    • 二、 *Shiro 架构原理*
    • 三、 INI文件介绍
    • 四、 Shiro环境搭建及认证实现
    • 五、 第一个Shiro演示
    • 六、 授权
    • 七、 加密及凭证匹配器
    • 八、 自定义Realm
    • 九、 凭证匹配器

一、 Shiro 简介

1 概述

权限体系在现代软件应用中有着非常重要的地位。一个应用如果没有权限体系都会显着这个系统“特别不安全”,无论是传统的MIS系统还是互联网项目出于对业务数据和应用自身的安全,都会设置自己的安全策略。
目前市场上专门的Java权限框架有Apache Shiro 和 Spring Security。相较于Spring Security 来说 Shiro更加老牌,所以就先讲解Shiro,在后面的阶段中讲解Spring Security。学习好Shiro对于以后市场上在出现新型权限框架的学习能带来很大便利。因为权限的概念是不变的,变得是框架的实现方式。当然了,对于第一次学习权限框架的人来说,相较于权限框架的应用,更难的就是权限方面的概念。

2 Shiro官方解释

中文:Apache Shiro是一个强大的并且简单使用的java权限框架.主要应用认证(Authentication),授权(Authorization),cryptography(加密),和Session Manager.Shiro具有简单易懂的API,使用Shiro可以快速并且简单的应用到任何应用中,无论是从最小的移动app到最大的企业级web应用都可以使用.

3 核心功能

在Shiro官网首页上占用了很大的篇幅说明了Shiro的核心功能。
Authentication 认证。如用户的登录。
Authorization 授权。用户是否有权限访问指定URL等。
Cryptography 密码学。如密码的加密。
Session Management Session 管理。
Web Integration Web集成。Shiro不依赖于容器。

二、 Shiro 架构原理

必须会。Shiro学习的重中之重。
在这里插入图片描述

1 第一行

第一行中示例出了一些语言。无论是什么语言都需要包含Subject

2 Subject

主体。每个用户登录成功后都会对应一个Subject对象,所有用户信息都存放在Subject中。可以理解:Subject就是Shiro提供的用户实体类。

3 Security Manager

Shiro最大的容器,此容器中包含了Shiro的绝大多数功能。在非Spring Boot项目中,获取Security Manager 是编写代码的第一步。而在Spring Boot中已经帮助我们自动化配置了。

4 Authenticator

认证器。执行认证过程调用的组件。里面包含了认证策略。

5 Authorizer

授权器。执行授权时调用的组件。

6 Session Manager

Shiro被Web集成后,HttpSession对象会由Shiro的Session Manager进行管理。

7 Cache Manager

缓存管理。Shiro执行很多第三方缓存技术。例如:EHCache等。

8 Session DAO

操作Session内容的组件。

9 Realms

Shiro框架实现权限控制不依赖于数据库,通过内置数据也可以实现权限控制。但是目前绝大多数应用的数据都存储在数据库中,所以Shiro提供了Realms组件,此组件的作用就是访问数据库。Shiro内置的访问数据库的代码,通过简单配置就可以访问数据库,也可以自定义Realms实现访问数据库逻辑(绝大多数都这么做)

三、 INI文件介绍

INI英文名称(InitializationFile)
INI文件是Window系统配置文件的扩展名.
Shiro的全局配置文件就是.ini文件,ini中数据都是固定数据,后面会用数据库中数据替代下面users和roles(固定数据部分)
.ini文件内容的语法和.properties类似都是key=value,value格式.
INI文件中包含了四个部分:

1 [main] 主体部分.

这部分配置类对象,或设置属性等操作.
内置了根对象:securityManager,注意对象名大小写。

[main]
securityManager.属性=值
key=value
securityManager.对象属性=com.bjsxt.pojo.People  #后面值是字符串
peo=com.bjsxt.pojo.People
securityManager.对象属性=$peo        #出现$时才表示是引用对象

2 [users]

定义用户,密码及用户可以具有的角色.

[users]
用户名=密码,角色1,角色2     #角色部分可以省略.
zhangsan=zs
zhangsan=zs,role1,role2

3 [roles]

定于角色具有的权限

[roles]
角色名=权限名,权限名
role1=user:insert,user:update
role2=insert,update
role3=user:*

4 [urls]

定义哪个控制器被哪个过滤器过滤.Shiro内置很多过滤器。此部分主要在WEB应用中使用。
下图是官网上提供的Shiro内置Filter及名称。
在这里插入图片描述

anon:不认证也可以访问。例如:/admin/=anon
authc:必须认证。
authcBasic:没有参数时表示httpBasic认证(客户端认证方式)。
logout:退出。
noSessionCreation:新增Filter,表示没有Session创建。
perms:判断是有具有指定权限。例如:/admin/user/
=perms[“per1”,”per2”]。必须同时具有给定权限才可以访问。如果只有一个权限可以省略双引号。
port:限制端口。例如:/admin/=port[8081]。只要请求不是8081端口就重新发送URL到8081端口。
rest:请求方式和权限的简便写法。例如:/admin/
=rest[user],相当于/admin/** = perms[user:方式],方式是http请求的方式:post、get等。
roles:判断是否具有指定权限。/admin/**=roles[role1]
ssl:表示是安全的请求。协议为https
user:表示必须存在用户。

[urls]
控制器名称=过滤器名称
/login=authc
/**=anon

四、 Shiro环境搭建及认证实现

1 认证流程
获取主体,通过主体Subject对象的login方法进行登录
把Subject中内容传递给Security Manager
Security Manager内部组件Authenticator进行认证,
认证数据使用InI Realm,调用Ini文件中数据.
在这里插入图片描述

2 名词解释

Principal: 身份。用户名,邮箱,手机等能够唯一确认身份的信息.
Credential: 凭证,代表密码等。
AuthenticationInfo:认证时存储认证信息。

五、 第一个Shiro演示

Shiro是不依赖于容器的,所以建立一个普通的Maven项目就可以。
1 添加依赖

<dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
</dependencies>

2 新建配置文件
在resources下新建shiro.ini,文件名称任意,扩展名必须是ini。

[users]
zhangsan=zs
lisi=ls

3 新建测试类
新建com.bjsxt.ShiroRun。

public class ShiroRun {public static void main(String[] args) {Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");SecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();//web项目时,用户名和密码是客户端表单传递过来的用户名和密码。AuthenticationToken token = new UsernamePasswordToken("admin", "pwd");try {//login()方法没有返回值,只能通过是否有异常判断是否登录成功。subject.login(token);System.out.println("登录成功");} catch (UnknownAccountException e) {System.out.println("账号不存在");} catch (IncorrectCredentialsException e) {System.out.println("密码错误");} catch (AuthenticationException e) {e.printStackTrace();}}
}

六、 授权

在这里插入图片描述

1 判断角色

1.1 修改配置文件
直接在密码后面添加用户包含的角色名即可。

[users]
zhangsan=zs,role1,role2
lisi=ls

1.2 添加代码

hasRole()通过返回值判断用户是否具有指定角色。

boolean hasRoleResult = SecurityUtils.getSubject().hasRole("role1");
System.out.println("result:"+hasRoleResult);

2 判断权限

2.1 修改配置文件

[users]
zhangsan=zs,role1,role2
lisi=ls
[roles]
role1=permission1,permission2

2.2 添加测试代码
通过是否出现AuthenticationException异常控制是否有指定权限。

SecurityUtils.getSubject().checkPermission("permission");

七、 加密及凭证匹配器

在实际开发中数据库中一些敏感信息经常会被加密存储。如:用户密码等。
Shiro框架内嵌了很多加密算法。如MD5等。使用Shiro框架时可以很方便的实现加密功能。

String password = "smallming";
//md5加密
Md5Hash md5Hash = new Md5Hash(password);
System.out.println(md5Hash.toHex());
//带盐的MD5加密。盐就是在原有字符串后面拼接盐形成新的字符串,然后加密。
Md5Hash md5Hash2 = new Md5Hash(password, "bjsxt");
System.out.println(md5Hash2);
//无论是否加盐都可以很容易的被破解,可以多次迭代加密保证数据安全性。
//第三个参数表示迭代加密次数
Md5Hash md5Hash3 = new Md5Hash(password, "bjsxt", 2);
System.out.println(md5Hash3);//使用Md5的父类也也实现
SimpleHash simpleHash = new SimpleHash("md5",password,"bjsxt",2);
System.out.println(simpleHash);

八、 自定义Realm

ShiroRun 代码不需要做任何变化。

1 自定义Realm类

在项目中新建com.bjsxt.realm.MyRealm

public class MyRealm extends AuthenticatingRealm {@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {System.out.println("执行认证");//用户名String username = token.getPrincipal().toString();//密码String pwd = new String((char[])token.getCredentials());System.out.println(username+"  "+pwd);//先从数据库查询select * from user where username=? 查看用户名是否存在if(username.equals("admin")){//假设用户名为admin时能从数据库中查询出来//根据之前查询出来的用户信息获取密码。假设查询出来的密码是pwdString password= "pwd";//此处需要注意,第二个参数是从数据库查询出来的密码,而不是传递过来的密码。//第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字。AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(),password,"realmname");//shiro会判断从数据库查询出来的密码和客户端传递过来的密码是否一致。return info;}//返回null说明用户名不存在。return null;}
}

2 修改配置文件

在配置文件中添加下面内容

[main]
myrealm=com.bjsxt.realm.MyRealm
securityManager.realms=$myrealm

3 测试结果

在ShiroRun中修改用户名和密码,当用户名和密码为admin、pwd时可以正常登录。
此时无论shiro.ini是否配置了[users],都按照Realm中配置的逻辑进行比较用户名和密码。

九、 凭证匹配器

在实际应用中数据库密码都是加密的。Shiro内置了凭证匹配器,通过简单配置就可以实现明文数据和数据库中加密数据匹配的效果。

1 修改自定义Realm

AuthenticationInfo 的构造方法由三个参数变成四个参数的。新增第三个参数表示加盐。
一般都是拿用户数据的id作为盐。

//密码必须是MD5加密后的密码
String password= "7614fd642608ca0755b78d2b2c352e19";
//假设id是从数据库中取出的id
Long id = 123L;
//第三个参数是加密的盐
AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), password, ByteSource.Util.bytes(id+"") ,token.getPrincipal().toString());

2 修改配置文件
在配置文件中配置凭证匹配器配置。

[main]
md5CredentialsMatcher=org.apache.shiro.authc.credential.Md5CredentialsMatcher
md5CredentialsMatcher.hashIterations=2myrealm=com.bjsxt.shiro.MyRealm
myrealm.credentialsMatcher=$md5CredentialsMatcher
securityManager.realms=$myrealm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同理心是通往成功架构的桥梁

一、什么是同理心 同理心&#xff08;Empathy&#xff09;&#xff0c;又叫做换位思考、神入、共情&#xff0c;指站在对方立场设身处地思考的一种方式&#xff0c;即与人际交往过程中&#xff0c;能够体会他人的情绪和想法、理解他人的立场和感受&#xff0c;并站在他人的角度…

星梦小组KTV点歌系统简介

班 级&#xff1a;19级青鸟3班组 名&#xff1a;星梦小组班主任&#xff1a;王欣欣老师指导老师&#xff1a;穆雄雄老师组 长&#xff1a;刘娜 副组长&#xff1a;王宝兴、汪杰小组成员&#xff1a;汪杰、方传森、王宝兴、赵燕涵、云善辉、丁长琨、翟选浩、蔺广兴、王建业、路亚…

漫画:什么是计数排序

转载自 漫画&#xff1a;什么是计数排序 假定20个随机整数的值如下&#xff1a; 9&#xff0c;3&#xff0c;5&#xff0c;4&#xff0c;9&#xff0c;1&#xff0c;2&#xff0c;7&#xff0c;8&#xff0c;1&#xff0c;3&#xff0c;6&#xff0c;5&#xff0c;3&#xf…

Office365开发系列——开发一个全功能的Word Add-In

2016年10月我参加了在北京举行的DevDays Asia 2016 - Office 365应用开发”48小时黑客马拉松“&#xff0c;我开发的一个Word Add-In Demo——WordTemplateHelper获得了二等奖。在会场有幸结识了陈希章老师&#xff0c;在与陈老师的交流中受益良多&#xff0c;得知陈老师在准备…

秒懂python的深浅copy

dict , list ,set , s {name:alex....} s2 s , 此时s2和s是共享 同一份数据 的&#xff0c;copy一份新数据 , 浅copy, 只copy第一层 s2 s.copy() 深copy s4 copy.deepcopy(s)浅拷贝 深拷贝

SpringBoot整合Shiro实现登录认证和授权CHCache

文章目录一、 springboot实现普通登录1 添加依赖2 编写配置文件3 新建实体类和mapper4 编写业务层代码5 编写控制器6 编写启动类7 编写登录页面和主页面二、 springboot整合shiro实现登录认证和凭证匹配1 添加依赖2 自定义Realm3 编写配置4 userService新增单元方法&#xff1a…

java中如何对对象排序?

大家好&#xff0c;我是雄雄。前言&#xff1a;我们知道&#xff0c;在平时做项目的过程中&#xff0c;我们总会用到各种各样的排序&#xff0c;或是升序&#xff0c;或是降序。在java中&#xff0c;要实现排序有好多中方式&#xff0c;比如我们耳熟能详的冒泡排序、选择排序等…

Java程序员必看的 13 本 Java 书籍

转载自 Java程序员必看的 13 本 Java 书籍 关乎于程序员&#xff0c;除了做项目来提高自身的技术&#xff0c;还有一种提升自己的专业技能就是&#xff1a;多&#xff01;看&#xff01;书&#xff01; 毕竟&#xff0c;书是学习的海洋呢&#xff01;So&#xff0c;Java程序…

祝你生日快乐!

祝生日快乐今天&#xff0c;于我来说是个特别的日子。本来&#xff0c;我是比较低调的&#xff0c;尤其是对于生日来说&#xff0c;可以说是这些年都没有好好的过过&#xff0c;要么忘记了&#xff0c;要么就是在异国他乡的&#xff0c;谁都不识&#xff0c;这一天和往常的一天…

.NET Exceptionless 日志收集框架本地环境搭建

一、简介 Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web Api&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;MVC 等技术栈的应用程序中&#xff0c;并且提供了Rest接口可以…

java中如何对汉字进行排序?

前言&#xff1a;上一篇文章我们讲解了java中实现Comparator进行排序 和实现Comparable进行排序&#xff0c;我们分别举例根据学号和姓名降序排序&#xff0c;原文在这里&#xff1a;java中如何对对象排序&#xff1f; &#xff0c;不过在文章的最后&#xff0c;我故意留了个问…

Blazor将.NET带回到浏览器

由Steve Sanderson开发的Blazor尝试使用WebAssembly和DotNetAnywhere将.NET带回到浏览器。它不是要成为一个像Flash或Silverlight那样的完整生产框架&#xff0c;而是要探索一下有什么可能性。 WebAssembly将自己描述成一个“内存安全的沙箱执行环境”标准&#xff0c;它“甚至…

过滤器和监听器

文章目录01 过滤器的简介02 使用过滤器进行乱码解决03 使用过滤器进行登陆的控制04 过滤器更多内容05 监听器实现日志记录06 监听器实现在线人数的统计07 其他监听器使用01 过滤器的简介 为什么使用过滤器&#xff1f; 我们目前书写项目中遇到的问题&#xff1f; A、目前使用的…

高启航:秋运会!

本文原创&#xff1a;高启航&#xff08;本文所有收益均归高启航所有&#xff09;在十月份的二十一号&#xff0c;我们济南信息工程学校迎来了一年一度的秋季运动会。这次秋运会&#xff0c;每一个班级所准备的开幕式、训练已久的千人武术大展演、以及在运动会上表现优越的运动…

用python画出吉祥物

大前提 你需要一个"npy" 效果图 源码 # 库的导入 import turtleturtle.title(PythonBingDwenDwen&#xff08;axing&#xff09;) #这里的字我们可以自己进行修改turtle.speed(10) # 速度&#xff0c;如果觉得20快了&#xff0c;你们可以设置10# 左手 turtle.p…

RabbitMQ知多少

1.引言 RabbitMQ——Rabbit Message Queue的简写&#xff0c;但不能仅仅理解其为消息队列&#xff0c;消息代理更合适。RabbitMQ 是一个由 Erlang 语言开发的AMQP&#xff08;高级消息队列协议&#xff09;的开源实现&#xff0c;其内部结构如下&#xff1a; RabbitMQ作为一个…

王宝兴:秋运会

本文原创&#xff1a;王宝兴本文所有收益归王宝兴所有一年一度的运动会如期而至。可谓是“沙场秋点兵”的壮阔&#xff0c;给了我们难以言喻的激情。为了入场式&#xff0c;为了我们每个人&#xff0c;为了我们整个班集体&#xff0c;所有人付出的不止一点&#xff0c;在这短短…

.NET Core快速入门教程 1、开篇:说说.NET Core的那些事儿

一、.NET Core的诞生 聊 .NET Core&#xff0c;就不得不说他的爸爸 .NET。当年Java刚刚兴起&#xff0c;如火如荼&#xff0c;微软也非常推崇Java&#xff0c;当时Windows平台的Java虚拟机就是微软按照JVM标准实现的&#xff0c;据说也是当时性能最好的Java虚拟机。但是微软也…

机器学习和深度学习概念入门

转载自 机器学习和深度学习概念入门 作者&#xff1a;谭东 遵循&#xff1a;BY-SA&#xff08;署名-相同方式共享4.0协议&#xff09; 对于很多初入学习人工智能的学习者来说&#xff0c;对人工智能、机器学习、深度学习的概念和区别还不是很了解&#xff0c;有可能你每天…