Shiro学习_02(认证)

Shiro认证(Authentication) Apache Shiro 是一个强大易用的Java安全框架,提供了认证、授权、会话管理和加密等功能,并对任意一个应用程序,Shiro都可以提供全面的安全管理服务。 阅读详情

Shiro身份验证

  • 认证: 判断一个用户是否为合法用户的处理过程。即提供用户名和密码,检验是否与数据库存储的用户名密码一致。

Shrio中认证的管家对象

  • Subject:主体

访问系统的用户

  • Principal:身份信息

身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。
一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号

  • Credential:凭证信息

证明 / 凭证,即只有主体知道的安全值,如密码 / 数字证书等。

认证流程

使用加密认证(MD5+Salt+Hash)

MD5加密

package com.shiro.util;

import org.apache.shiro.crypto.hash.Md5Hash;

import java.util.UUID;

public class TestShiroMD5 {
    public static void main(String[] args) {
        // 可以使用uuid作为盐值
        String uuid = UUID.randomUUID().toString().replace("-", "");
        System.out.println("UUID: "+uuid);
        // 使用md5 + salt + hash散列(参数代表要散列多少次,一般是 1024或2048)
        Md5Hash md5Hash2 = new Md5Hash("123456", uuid, 1024);
        System.out.println(md5Hash2.toHex());
    }
}
  • 输出

UUID: 3e451cd1bce14b5e86588a13559c83d6
094aa06418bda3cbb3cb61c875e6c5a9

自定义加密的Realm

package com.shiro.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;


/**
 * 使用自定义realm 加入md5 + salt +hash
 */
public class CustomerMd5Realm extends AuthorizingRealm {

    /**
     * 授权
     *
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    /**
     * 认证
     *
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 获取token中的用户名和密码
        String principal = (String) token.getPrincipal();
        String credentials = new String((char[]) token.getCredentials());

        // 模拟数据库查询到的信息
        String username = "shiro";
        // 密码使用MD5生成加密后的密码”123456“
        String password = "094aa06418bda3cbb3cb61c875e6c5a9";
        // 使用uuid生成的值作为盐值
        String salt = "3e451cd1bce14b5e86588a13559c83d6";

        // 根据用户名查询数据库
        if (username.equals(principal)) {
            /**
             * 依次传入:账号信息、加密后的密码、密码加密的盐值、当前realm对象的name
             */
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal
                    , password
                    , ByteSource.Util.bytes(salt)
                    , this.getName());

            return simpleAuthenticationInfo;
        }
        return null;
    }
}

使用加密Realm认证

package com.shiro.test;

import com.shiro.realm.CustomerMd5Realm;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;

@Slf4j
public class TestCustomerMd5RealmAuthenicator {

    public static void main(String[] args) {
        // 1.创建安全管理员
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        // 2.注入realm
        CustomerMd5Realm realm = new CustomerMd5Realm();
        // 3.设置realm使用hash凭证匹配器
        HashedCredentialsMatcher credentialsMathcher = new HashedCredentialsMatcher();
        // 设置使用的算法
        credentialsMathcher.setHashAlgorithmName("md5");
        // 设置散列次数
        credentialsMathcher.setHashIterations(1024);

        realm.setCredentialsMatcher(credentialsMathcher);
        defaultSecurityManager.setRealm(realm);

        // 4.将安全管理器注入安全工具
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        // 5.通过安全工具类获取subject
        Subject subject = SecurityUtils.getSubject();
        // 6.认证
        UsernamePasswordToken token = new UsernamePasswordToken("shiro", "123456");

        try {
            subject.login(token);
            log.info("登录成功");
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            log.error("用户名错误");
        } catch (IncorrectCredentialsException e) {
            e.printStackTrace();
            log.error("密码错误");
        }
    }
}

未加密

自定义Realm

package com.shiro.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 自定义Realm
 */
public class CustomerRealm extends AuthorizingRealm {

    /**
     * 授权
     *
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    /**
     * 认证
     *
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 从token中获取用户名
        String principal = (String) token.getPrincipal(); //得到用户名
        String credentials = new String((char[])token.getCredentials()); //得到密码
        System.out.println(principal);
        System.out.println(credentials);

        // 在实际开发中,用户身份信息是从数据库中查询的
        // 假设从数据库中获取了用户名和密码
        String username = "shiro";
        String password = "123456";

        if (username.equals(principal)) {
            /**
             * principal: 数据库的用户名
             * password: 数据库的密码
             * this.getName(): 提供当前realm的名字
             */
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal
                    , password
                    , this.getName());

            return simpleAuthenticationInfo;
        }
        return null;
    }
}

使用未加密Realm认证

package com.shiro.test;

import com.shiro.realm.CustomerRealm;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;

/**
 * 测试自定义的Realm
 */
@Slf4j
public class TestAuthenticatorCusttomerRealm {

    public static void main(String[] args) {
        // 1.创建安全管理对象securityManager
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        // 2.给安全管理器设置realm(设置为自定义realm获取认证数据)
        defaultSecurityManager.setRealm(new CustomerRealm());
        // 3.给安装工具类中设置默认安全管理器
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        // 4.获取主体对象subject
        Subject subject = SecurityUtils.getSubject();
        // 5.创建token令牌
        UsernamePasswordToken token = new UsernamePasswordToken("shiro", "123456");

        try {
            // 用户登录
            subject.login(token);
            log.info("登陆成功");
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            log.error("用户名或密码错误");
        }
    }
}
SpringBoot集成shiro认证,实现Shiro认证的登录操作 其实,扩展阅读:(看一下官方的解释为什么叫Subject而不叫User)翻译如下:我们最初是想把它叫做User的,这样很容易理解,但是大部分的应用程序都已经有了User类,为了不和这些原有的api发生冲突,我们最后决定不这么做。 阅读详情

相关推荐

aubo i5 + realsense D435i识别抓取实践二

aubo i5 + realsense D435i识别抓取实践二前言一、手眼标定是什么?二、标定软件安装1.aruco_ros安装2.vision_visp安装3.easy_handeye安装4.realsense驱动安装5.安装realsense ROS软件包三、配置1.launch文件修改2.打印二维码四、手眼标定1.启动launch文件2.标定步骤3.发布tf关系 前言 前面配置好了aubo机械臂的ROS软件包,机械臂可以正常运行后,接下来我们进行机械臂与相机的手眼标定。手眼标定分为eye_on_ha

转角 6373

Realm数据库使用教程(七):数据库加密和Realm使用注意事项

Realm数据库使用教程(六):数据迁移数据库加密Realm自带数据库加密,需要64位字节数据进行加密。 官方原文Realm 文件可以通过传递一个512位(64字节)的密钥参数给 Realm.getInstance().encryptionKey() 来加密存储在磁盘上。byte[] key = new byte[64]; new SecureRandom().nextBytes(key); Rea

黄孝果的博客 5313

(一篇即成功)Ubuntu下搭建qt环境和安装Qt Creator

只需一篇就成功搭建Ubuntu下的QT环境 你还在等什么

m0_73450461的博客 1万+

shiro-密码比较的设计 CredentialsMatcher -为什么Java中的密码优先使用 char[] 而不是String?

密码比较 昨天的时候,笔者仔细的追踪了,整个获取信息的主要的设计,通过用户的唯一标识得到 AuthenticationInfo 然后和 AuthenticationToken (用户名 密码),进行比较! 有一个专门的设计类,用来处理密码匹配的比较的。而且很复杂~AuthenticatingRealm中有一个成员变量 private CredentialsMatcher credenti

汪小哥 1万+

TM1650数码管驱动芯片

简介 TM1650是一款国产4位共阴数码管驱动芯片,它还带有矩阵按键扫码功能。它的基本参数如下: 工作电压:3~5V 数码管驱动模式:8段x4位共阴数码管 矩阵按键驱动模式:7x4矩阵按键,不支持组合键 通信接口:类IIC,使用了IIC相同的时序,但没有完全遵守IIC的协议,不带从机地址 引脚定义 SCL:串行通信时钟线 SDA:串行通信数据线 做数码管驱动使用时 DIGx:数码管的位选引脚,灌电流驱动,最大可吸收150mA电流 A~DP:数码管的段驱动引脚,拉电流驱动,最大可输出25m

luliplus的博客 4万+

linux应用程序段错误调试

一、堆、栈 在分析段错误之前,先了解一下什么是堆?什么是栈? 堆:一般由开发者分配释放,如果没有释放,程序结束时,在有的OS中可能会被自动释放,分配方式类似于链表。堆的操作方式为,队列优先,先进先出的原则。 栈:由操作系统自动分配,存放函数的参数值,局部变量。栈的操作方式为,先进后出的原则。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。  PUSH:操作在堆栈的顶部加入一个元素...

农村种地人 1110

Shiro学习笔记_02:shiro的认证+shiro的授权

Shiro 学习笔记 本文基于B站UP主【编程不良人】视频教程【2020最新版Shiro教程,整合SpringBoot项目实战教程】进行整理记录,仅用于个人学习交流使用。 视频链接:https://www.bilibili.com/video/BV1uz4y197Zm 官方文档:http://www.baizhiedu.xin 目录标题Shiro 学习笔记四、shiro中的认证4.1 认证4.2 shiro中认证的关键对象4.3 认证流程4.4 认证的开发1. 创建项目并引入依赖2. 引入shiro配置

耿鬼不会笑的博客 9021

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 272

Shiro 安全框架学习02----认证中的MD5+Salt

一、MD5算法介绍 作用:一般用来加密 或者 签名(校验和) 特点:MD5算法不可逆; 如果内容相同,无论执行多少次md5生成结果始终是一致的。 生成结果:始终是一个16进制32位长度的字符串 +salt(盐)的原因:防止被一些采用穷举算法的网站破解简单的密码。 二、MD5 + Salt 实现的流程 实际应用是将盐和散列后的值存在数据库中,自动realm从数据库取出盐和加密后的值由shiro完成密码检验。 ...

Significance的博客 224

【Bug已解决】codex: conversation context window exceeded / Token limit reached — CodeX CLI 上下文窗口超限解决方案

CodeX CLI 上下文窗口超限(context_length_exceeded)的解决方案,含开新会话、更大窗口模型、精简提示与限制工具输出。

博客 4180

大疆 2021 嵌入式笔试题

在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。

qq_38769551的博客 2495

Springboot整合Shiro之认证

  Shiro是我们常用的一个权限管理框架,我们之前已经详细的给大家介绍过了Shiro的基础知识,不太清楚的可以参考下 https://blog.youkuaiyun.com/qq_38526573/category_9284714.html 此文,本文的重点是来介绍下在SpringBoot环境下我们怎么来使用Shiro。 一、添加相关依赖 本案例中我们使用SpringDataJPA和Thymeleaf来配合...

波波烤鸭的博客 2万+

YOLO26全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1032

Shiro框架——shiro的认证

通过分析源码可得:自定义Realm的作用:放弃使用.ini文件,使用数据库查询上边的程序使用的是Shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。1.shiro提供的Realm2.根据认证源码认证使用的是SimpleAccountRealmSimpleAccountRealm的部分源码中有两个方法一个是认证一个是授权//.......省略= null) {

2301_79438104的博客 2326

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

shiro的实现认证

1,基本概念 1,身份验证 即在应用中谁能证明他就是他本人。一般提供如他们的身份ID 一些标识信息来 表明他就是他本人,如提供身份证,用户名/密码来证明。 在 shiro 中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能 验证用户身份: 2,principals 【/'pr?ns?pl】 身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。 一个主体可以有多个principals,但只有一个Primar

京北游戏官方 8848

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

shiro关于认证的学习

一、shiro认证入门程序工程 shiro分为认证和授权,这里我们先学习shiro的认证。 1、shiro认证流程 2、shiro认证入门工程的搭建 (1)首先创建一个java工程 在eclipse中显示的工程结构 (2)添加shiro的jar包 最核心的jar包就是:shiro-core.jar(下边其他的是需...

繁华似锦Fighting 1593

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

四、Shiro认证

四、Shiro认证4.1、认证4.2、shiro认证关键对象4.3、认证流程4.4、认证开发1、创建项目并引入依赖2、引入shiro配置文件并加入如下配置3、认证代码查看类的关系图4.5、自定义Realm1、shiro提供的Realm2、自定义Realm4、使用自定义Realm4.6、使用MD5和Salt1、自定义md5+salt错误加密(未加密)真正的加密使用MD5+Salt使用MD5+Salt+Hash2、测试测试-明文新建CustmerMD5Realm新建testCustmerMD5Authenti.

一个孤独漫步者的遐想的博客 3580

Shiro认证

Shiro是Apache基金会下的一个开源Java权限管理框架,提供了身份验证、授权、密码和会话管理等功能。其核心架构包括主体(Subject)、安全管理器(SecurityManager)、认证器(Authenticator)、授权器(Authorizer)、领域(Realm)等组件。在大部分情况下,系统需要从数据库中读取用户信息进行认证。因此,需要自定义Realm来实现这一功能。

y050505的博客 657

Shiro之实现认证篇

本篇博客带大家学习Shiro怎样实现认证。 Shiro的认证过程 1.创建Security Manager对象去构建Security Manager的环境。(用于提供安全服务) 2.主体提交认证请求给Security Manager,Security Manager去通过Authenticator(认证器)来从Realms中获取认证信息,然后用Realms从数据库中获取的认证信息和主体提交过...

小宋的博客 5691

Shiro框架2——shiro的认证+shiro的授权

通过分析源码可得:认证:1.最终执行用户名比较是 在SimpleAccountRealm类 的 doGetAuthenticationInfo 方法中完成用户名校验2.最终密码校验是在 AuthenticatingRealm类 的 assertCredentialsMatch方法 中总结:认证realm授权realm自定义Realm的作用:放弃使用.ini文件,使用数据库查询。

qq_64064246的博客 1833

Shiro 实战教程之shiro中的认证02

Shiro 实战教程之shiro中的认证02 shiro中的认证 4.1 认证 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。 4.2 shiro中认证的关键对象 Subject:主体 访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体; Principal:身份信息 是主体(subject)进行身份认证的标识,标识必须具有唯一性,

helloworld工程师的博客 307
上一篇: Shiro学习_01(入门)
下一篇: 力扣 - 11. 盛最多水的容器
hanlin-hl
博客等级 码龄8年 3粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanlin-hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值