shiro实战详解(2)

shiro实战详解(2)

    • 03 Shiro入门
      • 1.身份认证
        • 1.1基本流程
        • 1.2案例
      • 2.Realm
        • 2.1Realm接口
        • 2.2认证案例
        • 2.3认证授权案例
      • 3.编码、散列算法
        • 3.1编码与解码
        • 3.2散列算法
        • 案例
      • 4.身份授权
      • 5.Shiro默认过滤器
        • 5.1认证相关
        • 5.2授权相关

03 Shiro入门

1.身份认证

1.1基本流程

流程如下:

1、Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息

2、使用Subject门面获取到封装着用户的数据的标识token

3、Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager

把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm

4、认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法

1.2案例

1.坐标

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version>
</dependency>

2.设置shrio-test-01.ini模拟数据库

[users]
jx=123456
djx=654321
hcy=147258

3.test类测试–>通过工厂创建SecurityManager对象,并认证

@Testpublic void show1(){//1.创建工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shrio_test_01.ini");//2.获取对象SecurityManager instance = factory.getInstance();//3.绑定当前对象到运行环境SecurityUtils.setSecurityManager(instance);//4.当前环境获取subjectSubject subject = SecurityUtils.getSubject();//用户String username= "jx";String userpasswd= "123456";//5.获取到令牌UsernamePasswordToken token = new UsernamePasswordToken(username, userpasswd);//6.登录验证subject.login(token);System.out.println("----------------"+subject.isAuthenticated());}

2.Realm

2.1Realm接口

在这里插入图片描述

2.2认证案例

1.创建MyRealm,继承AuthorizingRealm,实现两个方法

package com.ape.shrio;import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;import java.util.ArrayList;/*** @author jx* @version 1.0* @since 2023/11/6**/
public class MyRealm extends AuthorizingRealm {//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}//认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("执行认证操作");UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String username = token.getUsername();String userpwd = new String(token.getPassword());if ("jx".equals(username) && "123456".equals(userpwd)){SimpleAuthenticationInfo myshrio =new SimpleAuthenticationInfo(username, userpwd, "myRealm");//1.安全数据  2.用户密码 3.当前realmreturn  myshrio;}else{System.out.println("账号密码错误");throw new RuntimeException("账号密码错误");}}
}

2.设置shrio-test-02.ini模拟数据库

[users] # 用户
jx=123456,role1,role2
djx=654321,role2[roles]  # 角色
role1=user:save,user:update,user:delete
role2=user:find

3.test类测试

 @Testpublic void show(){//创建工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shrio_test_02.ini");//获取对象SecurityManager instance = factory.getInstance();//绑定当前对象到运行环境SecurityUtils.setSecurityManager(instance);//当前环境获取subjectSubject subject = SecurityUtils.getSubject();//用户String username = "jx";String userpwd = "123456";//获取到令牌UsernamePasswordToken token = new UsernamePasswordToken(username, userpwd);//登录验证subject.login(token);// 角色,权限System.out.println(subject.isAuthenticated());System.out.println(subject.hasRole("role1")); //trueSystem.out.println(subject.hasRole("role2")); //trueSystem.out.println(subject.isPermitted("user:save")); //trueSystem.out.println(subject.isPermitted("user:find")); //true}
2.3认证授权案例

1.设置shrio-test-03.ini声明myRealm

[main]
# 声明realm
myClass=com.ape.shrio.MyRealm
securityManager.realms=$myClass

2.创建MyRealm,继承AuthorizingRealm,实现重写两个方法

package com.ape.shrio;import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;import java.util.ArrayList;/*** @author jx* @version 1.0* @since 2023/11/6**/
public class MyRealm extends AuthorizingRealm {//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("执行授权方法");String username = (String)principalCollection.getPrimaryPrincipal();ArrayList<String> roles = new ArrayList<>();roles.add("role1");roles.add("role2");ArrayList<String> authoriys = new ArrayList<>();authoriys.add("user:save");authoriys.add("user:update");authoriys.add("user:delete");authoriys.add("user:find");SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();        authorizationInfo.addRoles(roles);authorizationInfo.addStringPermissions(authoriys);return authorizationInfo;}//认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("执行认证操作");UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String username = token.getUsername();String userpwd = new String(token.getPassword());if ("jx".equals(username) && "123456".equals(userpwd)){SimpleAuthenticationInfo myshrio =new SimpleAuthenticationInfo(username, userpwd, "myRealm");//1.安全数据  2.用户密码 3.当前realmreturn  myshrio;}else{System.out.println("账号密码错误");throw new RuntimeException("账号密码错误");}}
}

3.测试

   @Testpublic void show(){//创建工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shrio_test_03.ini");//获取对象SecurityManager instance = factory.getInstance();//绑定当前对象到运行环境SecurityUtils.setSecurityManager(instance);//当前环境获取subjectSubject subject = SecurityUtils.getSubject();//用户String username = "jx";String userpwd = "123456";//获取到令牌UsernamePasswordToken token = new UsernamePasswordToken(username, userpwd);//登录验证subject.login(token);System.out.println(subject.isAuthenticated());System.out.println(subject.hasRole("role1")); //trueSystem.out.println(subject.hasRole("role2")); //trueSystem.out.println(subject.isPermitted("user:save")); //trueSystem.out.println(subject.isPermitted("user:find")); //true}

3.编码、散列算法

3.1编码与解码

Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。

Shiro内部的一些数据的【存储/表示】都使用了base64和16进制字符串

3.2散列算法

散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如salt(即盐);这样散列的对象是“密码+salt”,这样生成的散列值相对来说更难破解。

shiro支持的散列算法:

Md2Hash、Md5Hash、Sha1Hash、Sha256Hash、Sha384Hash、Sha512Hash

案例

1.构建编码,解码类

package com.ape.code;import org.apache.shiro.codec.Base64;
import org.apache.shiro.codec.Hex;/*** @author jx* @version 1.0* @since 2023/11/6**/
public class GetCode {// 编码public static String Hexencode(byte[] bytes){return new String(Hex.encode(bytes));}// 解码public static byte[] Hexdecode(String code){return Hex.decode(code);}// 编码public static String Base64encode(byte[] bytes){return new String(Base64.encode(bytes));}// 解码public static byte[] Base64decode(String code){return Base64.decode(code);}
}

2.测试类

//Hex
@Test
public void show1(){String code = "123456789";String hexencode = GetCode.Hexencode(code.getBytes());System.out.println(hexencode);byte[] hexdecode = GetCode.Hexdecode(hexencode);System.out.println(new String(hexdecode));
}//Base64
@Test
public void show2(){String code = "apesource";String hexencode = GetCode.Base64encode(code.getBytes());System.out.println(hexencode);byte[] hexdecode = GetCode.Base64decode(hexencode);System.out.println(new String(hexdecode));
}

4.身份授权

4.1授权流程

1、首先调用Subject.isPermitted/hasRole接口,其会委托给SecurityManager。

2、SecurityManager接着会委托给内部组件Authorizer;

3、Authorizer再将其请求委托给我们的Realm去做;Realm才是真正干活的;

4、Realm将用户请求的参数封装成权限对象。再从我们重写的doGetAuthorizationInfo方法中获取从数据库中查询到的权限集合。

5、Realm将用户传入的权限对象,与从数据库中查出来的权限对象,进行一一对比。如果用户传入的权限对象在从数据库中查出来的权限对象中,则返回true,否则返回false。

进行授权操作的前提:用户必须通过认证。

5.Shiro默认过滤器

Shiro内置了很多默认的过滤器,比如身份验证、授权等相关的。默认过滤器可以参考org.apache.shiro.web.filter.mgt.DefaultFilter中的枚举过滤器
在这里插入图片描述

5.1认证相关
过滤器过滤器类说明默认
authcFormAuthenticationFilter基于表单的过滤器;如“/**=authc”,如果没有登录会跳到相应的登录
logoutLogoutFilter退出过滤器,主要属性:redirectUrl:退出成功后重定向的地址,如“/logout=logout”/
anonAnonymousFilter匿名过滤器,即不需要登录即可访问;一般用于静态资源过滤;示例“/static/**=anon”
userUserFilter用户拦截器,用户已经身份验证/记住我登录的都可;示例“/**=user”
authcBasicBasicHttpAuthenticationFilterBasic HTTP身份验证拦截器,主要属性: applicationName:弹出登录框显示的信息(application);
5.2授权相关
过滤器过滤器类说明
rolesRolesAuthorizationFilter角色授权拦截器,验证用户是否拥有所有角色; 主要属性: loginUrl:登录页面地址(/login.jsp);unauthorizedUrl:未授权后重定向的地址;示例“/admin/**=roles[admin]”
permsPermissionsAuthorizationFilter权限授权拦截器,验证用户是否拥有所有权限;属性和roles一样;示例“/user/**=perms[“user:create”]”
portPortFilter端口拦截器,主要属性:port(80):可以通过的端口;示例“/test= port[80]”,如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样
restHttpMethodPermissionFilterrest风格拦截器,自动根据请求方法构建权限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串;示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll);
sslSslFilterSSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口(443);其他和port拦截器一样;

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

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

相关文章

关于 mysql数据库应用程序登录卡顿无响应崩溃 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135682663 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

易基因:cfDNA甲基化在器官和组织损伤检测中的强大力量

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 检测器官和组织损伤对于早期诊断、治疗决策和监测疾病进展至关重要。由于DNA甲基化模式可以响应组织损伤而改变&#xff0c;甲基化检测提供了一种有前途的方法&#xff0c;在早筛早诊、疾…

HarmonyOS—开发环境诊断的功能

为了大家开发应用/服务的良好体验&#xff0c;DevEco Studio提供了开发环境诊断的功能&#xff0c;帮助大家识别开发环境是否完备。可以在欢迎界面单击Help > Diagnose Development Environment进行诊断。如果已经打开了工程开发界面&#xff0c;也可以在菜单栏单击Help >…

域环境权限提升

Windows系统配置错误 在Windows系统中&#xff0c;攻击者通常会通过系统内核溢出漏来提权&#xff0c;但是如果碰到无法通过系统内核溢出漏洞法国提取所在服务器权限的情况&#xff0c;就会系统中的配置错误来提权。Windows系统中常见哦欸之错误包括管理员凭证配置错误&#x…

享元模式介绍

目录 一、享元模式介绍 1.1 享元模式定义 1.2 享元模式原理 1.2.1 享元模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、享元模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 抽象享元类 2.2.2.2 共享享元类-白色棋子 2.2.2.3 共享享元…

《对话品牌》—广西南宁隆生达发电力科技有限公司

本期节目《对话品牌》栏目邀请到了广西南宁隆生达发电力科技有限公司董事长叶占广参加栏目录制&#xff0c;分享企业品牌故事&#xff0c;树立企业品牌形象&#xff0c;提升企业品牌价值&#xff01; 节目嘉宾&#xff1a;叶占广先生 节目主持人&#xff1a;吴昊 节目播出平…

LaWGPT安装和使用教程的复现版本【细节满满】

文章目录 前言一、下载和部署1.1 下载1.2 环境安装1.3 模型推理 总结 前言 LaWGPT 是一系列基于中文法律知识的开源大语言模型。该系列模型在通用中文基座模型&#xff08;如 Chinese-LLaMA、ChatGLM等&#xff09;的基础上扩充法律领域专有词表、大规模中文法律语料预训练&am…

【学习记录24】vue3自定义指令

一、在单vue文件中直接使用 1、html部分 <template><divstyle"height: 100%;"v-loading"loading"><ul><li v-for"item in data">{{item}} - {{item * 2}}</li></ul></div> </template> 2、js…

YOLOV7剪枝流程

YOLOV7剪枝流程 1、训练 1&#xff09;划分数据集进行训练前的准备&#xff0c;按正常的划分流程即可 2&#xff09;修改train.py文件 第一次处在参数列表里添加剪枝的参数&#xff0c;正常训练时设置为False&#xff0c;剪枝后微调时设置为True parser.add_argument(--pr…

Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

测试中遇到想通过Jenkins下载OSS桶上的文件&#xff0c;要先在linux上安装ossutil工具&#xff0c;记录安装过程如下&#xff1a; 一、下载安装ossutil&#xff0c;使用命令 1.下载&#xff1a;wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限…

不同波段的热红外相机特点与应用

热红外相机通常分为三个主要波段&#xff1a; 长波红外 (LWIR) 波段&#xff1a;这个波段的范围大约在8-14微米。长波红外相机主要用于工业、安全监控和夜视设备。这个波段的特点是对温度变化非常敏感&#xff0c;能够在没有任何光源的情况下工作。 中波红外 (MWIR) 波段&…

使用的uview 微信高版本 头像昵称填写能力

<template><view><button class"cu-btn block bg-blue margin-tb-sm lg" tap"wxGetUserInfo">一键登录</button><view><!-- 提示窗示例 --><u-popup :show"show" background-color"#fff">&…

小程序开发实战案例五 | 小程序如何嵌入H5页面

在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况&#xff0c;今天我们就来聊一聊怎么把 H5 页面塞到小程序中。 本篇文章将会从下面这几个方面来介绍&#xff1a; 小程序承载页面的前期准备小程序如何承载 H5小程序和 H5 页面如何通讯小程序和 H5 页面的相互跳转 小…

Ubuntu重启后进入initramfs导致无法开机

今晚&#xff0c;我的电脑意外关机&#xff0c;重新开机后打开了虚拟机后出现initramfs&#xff0c;一直无法开机。该虚拟机使用的是 vm17,系统是ubuntu20, 解决方案 使用如下命令查看和识别磁盘、分区或文件系统的信息 在initramfs后面输入 fsck /dev/sdb4 ,即修复上面损坏的…

WINCC读写EXCEL-VBS

原创 RENHQ WINCC 关于VBS操作EXCEL的文档不管在论坛上还是在网上&#xff0c;相关的脚本已经很多&#xff0c;但是依然有很多人在问这个问题&#xff0c;于是把我以前在论坛上发的一个集合帖子的脚本拿来&#xff0c;重新开个帖子&#xff0c;如果再有人问的话&#xff0c;可…

kali下-MSF-ftp_login模块破解FTP账号及密码

一、环境准备 两台设备在同一个网络内 一台kali系统&#xff1a;192.168.10.128 一台winserver2016&#xff1a;192.168.10.132 二、MSF介绍 metasploit 全称是The Metasploit Framework&#xff0c;又称MSF&#xff0c;是Kali 内置的一款渗透测试框架&#xff0c;也是全球…

MySQL中锁的概述

按照锁的粒度来分可分为&#xff1a;全局锁&#xff08;锁住当前数据库的所有数据表&#xff09;&#xff0c;表级锁&#xff08;锁住对应的数据表&#xff09;&#xff0c;行级锁&#xff08;每次锁住对应的行数据&#xff09; 加全局锁&#xff1a;flush tables with read lo…

基于springboot+vue的图书个性化推荐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

线程同步--生产者消费者模型

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件变量的使用必须依赖于互斥锁以确保线…

数据结构之栈的基本操作

该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈 实现的功能有&#xff1a;入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素 此外根据上述功能&#xff0c;编写了数值转换&#xff08;十进制转化八进制&#xff09;方法、括号匹配方法…