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发生冲突,我们最后决定不这么做。 阅读详情

相关推荐

5G协议栈逆向工程:基于开源模拟器的核心网信令分析实战

本文详细介绍了基于开源模拟器Free5GC和UERANSIM的5G协议栈逆向工程实战,涵盖核心网信令分析、环境搭建、认证协议解析及安全漏洞验证。通过NGAP/NAS信令交互解密和异常流量注入测试,帮助研究人员深入理解5G网络安全机制,并提供实用的安全加固建议。

weixin_29250573的博客 671

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

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

黄孝果的博客 5313

【Excel VBA 编程】表格内自动生成进度条

在表格中生成进度条,进度条需要自适应单元格的宽度,根据不同进度区间变换颜色,并且按照进度数据大小显示其长短

wei1019的专栏 1518

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

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

汪小哥 1万+

Cesium 模拟飞机坠毁功能

Cesium 模拟飞机坠毁功能,粒子模拟

QQhelphelp的博客 1068

显著性算法 + 伪彩变换

利用opencv得到显著图和伪彩图

正在挣扎中的人 2298

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

29、网络支持技术:CDN、覆盖网络与无标度网络解析

本文详细解析了CDN路由方式与性能指标,探讨了覆盖网络与无标度网络的特性及其在云计算和现代网络中的应用。文章分析了CDN的关键技术与挑战,介绍了覆盖网络与小世界网络的基本原理,并深入讨论了无标度网络的构建算法、性能优化策略以及在多个领域的应用案例。最后,文章展望了未来网络技术发展趋势与无标度网络的结合潜力。

night的博客 87

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

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

Significance的博客 224

Ultralytics 框架中 model.predict() 返回的 results 对象的详细解析

通过掌握 results 对象的使用方法,您可以快速实现模型部署、数据分析与可视化。

浩瀚之水的专栏 747

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7375

Springboot整合Shiro之认证

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

波波烤鸭的博客 2万+

Origin教程004:Origin图形导出

需要编辑的话,双击图形,会自动用origin软件打开图形,这种方式是最开始导出图形的功能,方式一和二都是后面增加的。如果导出的图片边距较大的时候,会影响图片的美观,可以通过。也可以设置在PPT中直接编辑,找到。解决方法是,选择一条线,

WwLK123的博客 6327

Shiro框架——shiro的认证

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

2301_79438104的博客 2326

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

shiro的实现认证

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

京北游戏官方 8848

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

shiro关于认证的学习

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

繁华似锦Fighting 1593

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

四、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、付费专栏及课程。

余额充值