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.rhkb.cn/news/217125.html

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

相关文章

CSDN一键注释功能

这是什么牛逼哄哄的功能 看这里&#xff1a; 然后&#xff1a; 再试一个&#xff1a; 输出结果是&#xff1f;package yuyi03.interview;/*** ClassName: InterviewTest2* Package: yuyi03.interview* Description:** Author 雨翼轻尘* Create 2023/12/14 0014 0:08*/ publ…

self-attention|李宏毅机器学习21年

来源&#xff1a;https://www.bilibili.com/video/BV1Bb4y1L7FT?p1&vd_sourcef66cebc7ed6819c67fca9b4fa3785d39 文章目录 引言self-attention运作机制b1是如何产生的怎么求关联性数值 α \alpha α 从矩阵乘法的角度再来一次从A得到Q、K、V从Q、K得到 α \alpha α矩阵由…

后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)

后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力&#xff0c;整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面&#xff0c;方便产品经理们快速上手制作后台原型。 包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…

模拟目录管理 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。 支持命令: 1)创建目录命令: mkdir 目录名称,如mkdir abc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作…

IntelliJ IDEA的下载安装配置步骤详解

引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;它具有许多优势&#xff0c;适用于各种开发过程。本文将介绍 IDEA 的主要优势&#xff0c;并提供详细的安装配置步骤。 介绍 IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;之所以被广泛使用&#xff0c;…

【前端】HTML5 CSS3新特性(学习笔记)

HTML5 一、H5新增的语义化标签 以前布局&#xff0c;我们基本用 div 来做。div 对于搜索引擎来说&#xff0c;是没有语义的。 <header>&#xff1a;头部标签<nav>&#xff1a;导航标签<article>&#xff1a;内容标签<section>&#xff1a;定义文档某…

k8s debug 浅谈

一 k8s debug 浅谈 说明&#xff1a; 本文只是基于对kubectl debug浅显认识总结的知识点,后续实际使用再补充案例 Kubernetes 官方出品调试工具上手指南(无需安装&#xff0c;开箱即用) debug-application 简化 Pod 故障诊断: kubectl-debug 介绍 1.18 版本之前需要自己…

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"..."&#xff1a;表单标签&#xff0c;供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio"&#xff1a;输入类型为单选框。把name设置为一样的&#xff0c;这样效果上就是单选&#xff…

<蓝桥杯软件赛>零基础备赛20周--第10周--二分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

最新版ES8的client API操作 Elasticsearch Java API client 8.0

作者&#xff1a;ChenZhen 本人不常看网站消息&#xff0c;有问题通过下面的方式联系&#xff1a; 邮箱&#xff1a;1583296383qq.comvx: ChenZhen_7 我的个人博客地址&#xff1a;https://www.chenzhen.space/&#x1f310; 版权&#xff1a;本文为博主的原创文章&#xff…

拦截器与过滤器的区别

1.最通俗的理解 过滤器&#xff1a;你要从一堆请求中通过一个工具挑选出符合你要求的请求&#xff0c;而这个工具就是过滤器 拦截器&#xff1a;当一个流程正在进行时&#xff0c;你希望干预它的进展&#xff0c;甚至是直接将它终止 2.触发时机不同 过滤器是在请求进入容器…

提升软件安全性 - 运用Inno Setup打包技术实现序列号与机器绑定

背景 随着数字化时代的到来&#xff0c;软件已成为日常生活中不可或缺的一部分。无论是企业级应用还是个人用户&#xff0c;都需要通过软件实现各种功能。然而&#xff0c;在这种情况下&#xff0c;软件的安全性变得越来越重要。为了防止未经授权的复制和传播&#xff0c;许多…

java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。 下面介绍怎么通过twitter提供的API&#xff0c;进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”&#xff0c;点击edit进行信息编辑。 我的授权登录是个网页&#xff0c;并且只需要进行简单的…

计算机网络(三)

&#xff08;十一&#xff09;路由算法 A、路由算法分类 动态路由和静态路由 静态路由&#xff1a;人工配制&#xff0c;路由信息更新慢&#xff0c;优先级高。这种在实际网络中要投入成本大&#xff0c;准确但是可行性弱。 动态路由&#xff1a;路由更新快&#xff0c;自动…

SpringBoot的依赖管理和自动配置

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 依赖管理机制2 自动配置机制2.1 初步理解2.2 完整流程 &#x1f48e;总结 1 依赖管理机制 为什么导入starter-web后所有相关依赖都会导入进来&#xff1f; 开发什么场景&#xff0c;导入什么场景启动器-spring-bo…

Redis持久化AOF详解

基础面试题 什么是AOF AOF&#xff08;Append-Only File&#xff09;用于将Redis服务器收到的写操作追加到日志文件&#xff0c;通过该机制可以保证服务器重启后依然可以依靠日志文件恢复数据。 它的工作过程大抵分为以下几步&#xff1a; 收到客户端的写入命令(例如SET、DE…

nest.js框架基本使用

前言&#xff1a; 先把npm的镜像源切换成阿里巴巴的&#xff0c;要不然下载挺慢的&#xff1a; npm config set registry https://registry.npm.taobao.org npm config get registry 1.创建文件 先创建一个文件夹&#xff1a;nestDemo npm i -g nestjs/cli nest ne…

Nginx访问FTP服务器文件的时效性/安全校验

背景 FTP文件服务器在我们日常开发中经常使用&#xff0c;在项目中我们经常把FTP文件下载到内存中&#xff0c;然后转为base64给前端进行展示。如果excel中也需要导出图片&#xff0c;数据量大的情况下会直接返回一个后端的开放接口地址&#xff0c;然后在项目中对接口的参数进…

网站使用CDN后无法获取用户真实IP的解决方法

宝塔或Nginx环境 如果你使用的宝塔或Nginx&#xff0c;可以在宝塔面板或Nginx中&#xff0c;找到配置文件增加如下代码后&#xff0c;重载配置或者重启 Nginx 即可&#xff1a; #CDN获取真实ip set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; PHP语言函数方法…

Java刷题篇——LeetCode118. 杨辉三角

1.题目描述 给定一个非负整数numRows&#xff0c;生成杨辉三角的前numRows行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例1 输入&#xff1a;numRows 5 输出&#xff1a;[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] 示例2 输入&#xff1a;numRows 1…