shiro入门demo(一)身份验证

  shiro(身份)认证,简单来说就是登录/退出。搭建springboot项目,引入shiro和单元测试依赖:

  <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--shiro--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.2</version></dependency></dependencies>

身份认证的步骤:

(1)收集用户身份 / 凭证,即如用户名 / 密码;
(2)调用 Subject.login 进行登录,其会自动委托给 SecurityManager.login 方法进行登录。如果失败将得到相应的 AuthenticationException 异常,根据异常提示用户错误信息;否则登录成功。如果身份验证失败捕获 AuthenticationException 或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;
(3)最后调用 Subject.logout 进行退出操作,其会自动委托给 SecurityManager.logout 方法退出。

注意:身份验证是基础,如果身份验证出错其他的都会认证失败,比如密码错误而角色、权限是正确的,角色、权限认证也会失败。

一、身份认证配置文件mock数据实现:

 1、数据mock:新建shiro-user.ini文件

[users]
zs=123
ls=123
admin=123

  2、单元测试:

import com.demo.shiro.ShiroApplication;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** 身份验证*/
@SpringBootTest(classes = {ShiroApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class ShiroLoginTest{/***登陆/退出,以admin/123用户为例*/@Testpublic void testLoginInAndPut(){//1、创建SecurityManagerFactory,用户名/密码硬编码在ini文件,实际应存储在数据库并将密码加密IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro-user.ini");//2、创建安全管理器SecurityManager,并绑定给SecurityUtilSecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);//3、通过SecurityUtil获取登入用户主体subject,并创建tokenSubject subject = SecurityUtils.getSubject();UsernamePasswordToken token=new UsernamePasswordToken("admin", "123");//用户认证(shrio的核心功能之一)try {//异常//4、登录,即身份验证subject.login(token);System.out.println("认证成功");} catch (AuthenticationException e) {//5、认证失败//org.apache.shiro.authc.UnknownAccountException:账号错误异常//org.apache.shiro.authc.IncorrectCredentialsException:密码错误异常//org.apache.shiro.authz.UnauthorizedException: 授权错误异常System.out.println("认证失败");e.printStackTrace();}//6、安全退出subject.logout();}
}

执行,控制台输出:认证成功;

将密码改为123456,抛出密码错误异常

二、Realm域实现:

1、简单认证:realm一般是继承AuthorizingRealm,因为这里只有认证,就使用最简单的Realm了

package com.demo.shiro.realm;import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm;public class MyRealm1 implements Realm {@Overridepublic String getName() {return "myRealm1";}@Overridepublic boolean supports(AuthenticationToken token) {//仅支持UsernamePasswordToken类型的tokenreturn token instanceof UsernamePasswordToken;}@Overridepublic AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String username = (String) token.getPrincipal();String password = new String((char[]) token.getCredentials());if(!"admin".equals(username)){throw new UnknownAccountException();}if(!"123".equals(password)){throw new IncorrectCredentialsException();}//身份验证成功,返回一个AuthenticationInfo实现return new SimpleAuthenticationInfo(username,password,getName());}
}

按照这个方法再定义MyRealm2、MyRealm3,分别实现zs/123、ls/123。注入Reaml方法有两种,

(1)配置文件方法:新建shiro-user-realm.ini文件,

#1、声明realm
myRealm1 = com.demo.shiro.realm.MyRealm1
myRealm2 = com.demo.shiro.realm.MyRealm2
myRealm3 = com.demo.shiro.realm.MyRealm3
#2、指定securityManager的realms实现
securityManager.realms = $myRealm1,$myRealm2,$myRealm3

 将单元测试原来加载的shiro-user.ini改为shiro-user-realm.ini即可。

(2)编程方法:修改单元测试代码:

 //方法1,配置文件注入realm//1、创建SecurityManagerFactory,用户名/密码硬编码在ini文件,实际应存储在数据库并将密码加密//IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro-user-realm.ini");//2、创建安全管理器SecurityManager,并绑定给SecurityUtil//SecurityManager securityManager = factory.getInstance();//方法2,编程设置realmDefaultSecurityManager securityManager = new DefaultSecurityManager();List<Realm> realms = new ArrayList<>();realms.add(new MyRealm1());realms.add(new MyRealm2());realms.add(new MyRealm3());securityManager.setRealms(realms);

2、

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

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

相关文章

读书笔记-《数据结构与算法》-摘要6[快速排序]

快速排序 核心&#xff1a;快排是一种采用分治思想的排序算法&#xff0c;大致分为三个步骤。 定基准——首先随机选择一个元素最为基准划分区——所有比基准小的元素置于基准左侧&#xff0c;比基准大的元素置于右侧递归调用——递归地调用此切分过程 快排的实现与『归并排…

Axure的安装及界面基本功能介绍

目录 一. Axure概述 二. Axure安装 2.1 安装包下载 2.2 安装步骤 三. Axure功能介绍​ 3.1 工具栏介绍 3.1.1 复制&#xff0c;剪切及粘贴 3.1.2 选择模式和连接 3.1.3 插入形状 3.1.4 点&#xff08;编辑控点&#xff09; 3.1.5 置顶和置底 3.1.6 组合和取消组合 …

【LeetCode刷题笔记(5)】【Python】【盛最多水的容器】【中等】

文章目录 盛最多水的容器算法题描述示例示例 1示例 2 提示题意拆解解决方案&#xff1a;【双指针】运行结果复杂度分析 结束语 盛最多水的容器 盛最多水的容器 算法题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i…

【排序算法】希尔排序

一&#xff1a;基本介绍 插入排序介绍 1.1 插入排序存在问题 我们看简单的插入排序可能存在的问题 数组 arr {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是&#xff1a; {2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6} 结论:…

AI猫图片展示

AI猫展示 文章目录 AI猫展示

【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

计算机网络:物理层(奈氏准则和香农定理,含例题)

带你速通计算机网络期末 文章目录 一、码元和带宽 1、什么是码元 2、数字通信系统数据传输速率的两种表示方法 2.1、码元传输速率 2.2、信息传输速率 3、例题 3.1、例题1 3.2、例题2 4、带宽 二、奈氏准则&#xff08;奈奎斯特定理&#xff09; 1、奈氏准则简介 2、…

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件&#xff0c;而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块&#xff08;不管是Jar包还是Apk&#xff09;时&#xff1a; 在PC平台上&#xff0c;该模块包含的每一个Java源码文件都会对应生成一个同文件…

Flink Window中典型的增量聚合函数(ReduceFunction / AggregateFunction)

一、什么是增量聚合函数 在Flink Window中定义了窗口分配器&#xff0c;我们只是知道了数据属于哪个窗口&#xff0c;可以将数据收集起来了&#xff1b;至于收集起来到底要做什么&#xff0c;其实还完全没有头绪&#xff0c;这也就是窗口函数所需要做的事情。所以在窗口分配器…

计算机组成原理-ATT格式vsIntel格式

文章目录 AT&T格式 vs lntel格式 x86汇编语言是lntel格式&#xff0c;还有一种汇编语言格式是AT&T AT&T格式 vs lntel格式 lntel格式中取主存地址内容未指明长度默认为32位&#xff0c;对应下图中第四行右边的指令 百分号 美元符号 小括号 可用于计算机结构体数组…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

Amazon Q:对话智能赋能企业发展

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 。 在最近举办的亚马逊云科技大会上&#xff0c;引人瞩目的消息是A…

斑马zebra目标检测数据集VOC+YOLO格式2300张

斑马是由四百万年前的原马进化出来的&#xff0c;最早出现的斑马可能是细纹斑马。有关史前马科动物的化石现存于美国爱达荷州克文的克文化石床国家博物馆。斑马的史前马为“克文马”&#xff08;美洲斑马或者克文斑马&#xff09;&#xff0c;学名为“Equussimplicidens”&…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展&#xff0c;众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说&#xff0c;选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大&#xff0c;云服务…

Nacos-NacosRule 负载均衡—设置集群使本地服务优先访问

userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 NacosRule 权重计算方法 目录 一、介绍 二、示例&#xff08;案例截图&#xff09; 三、总结 一、介绍 NacosRule是AlibabaNacos自己实现的一个负载均衡策略&…

《教育信息化论坛》期刊杂志论文发表投稿

《教育信息化论坛》由中原大地传媒股份有限公司主管&#xff0c;河南电子音像出版社、文心出版社主办&#xff0c;我刊立足于教育信息化、教育现代化科研&#xff0c;重点介绍国内外信息化、现代化教学手段、教学方式、教学传播研究的新成果和新观点&#xff0c;推广成功的国内…

【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

目录 1 设置请求映射路径1.1 环境准备 1.2 问题分析1.3 设置映射路径 2 请求参数2.1 环境准备2.2 参数传递2.2.1 GET发送单个参数2.2.2 GET发送多个参数2.2.3 GET请求中文乱码2.2.4 POST发送参数2.2.5 POST请求中文乱码 欢迎大家回到《Java教程之Spring30天快速入门》&#xff…

认识缓存,一文读懂Cookie,Session缓存机制。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

一、CM4树莓派系统烧录

操作系统&#xff08;Raspberry Pi OS&#xff09;应用程序 Raspberry Pi OS系统&#xff08;树莓派推荐系统&#xff09;&#xff1a;较小的内存占用、较高的易用性以及对浮点单元的支持 浮点单元&#xff1a;浮点运算单元&#xff08;FPU&#xff09;是处理器中专门进行浮点…

windows redis 允许远程访问配置

安装好windows版本的redis&#xff0c;会以服务方式启动&#xff0c;但是不能远程访问&#xff0c;这个时候需要修改配置。redis安装路径下会有2个配置文件&#xff0c;究竟需要怎么修改才能生效呢&#xff1f;看下图 这里的redis服务指定了是redis.windows-service.conf文件&…