Spring Boot学习篇(十)

这篇具有很好参考价值的文章主要介绍了Spring Boot学习篇(十)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot学习篇(十)

shiro安全框架使用篇(二)——登录实例(密码以密文方式存储,不含记住密码)

1.模拟注册时,生成密文到数据库中

1.1 在zlz包下创建util包,并在下面创建SHAUtil01类(初始里面无方法)和SHAUtil02类,其目录结构如下所示

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

1.2 两种生成密文的方式
1.2.1 自己指定盐
a 核心代码
 public static String shaPassword(String oldPwd,String salt){
        return new SimpleHash("sha-256",oldPwd,salt,100).toString();
}
b 完整代码
package com.zlz.util;
import org.apache.shiro.crypto.hash.SimpleHash;
import java.util.Random;
public class SHAUtil01 {
    /**
     * 对密码使用sha256算法的方式加密
     * 加密不可逆: 无法通过新生成密文来反推出原来的密码
     * 盐是为了提高密码的安全系数的 随机生成的
     * 实际是拿你随机生成的盐和原来的字符串拼接在一起在来生成密文
     * 一般是可以使用随机字符串来表示盐的
     * hashIteration 表示加密计算的次数(拿盐和字符串拼接的次数) 散列次数越多 安全系越高
     * @param oldPwd 原密码
     * @param salt  盐
     * @return
     */
    public static String shaPassword(String oldPwd,String salt){
        return new SimpleHash("sha-256",oldPwd,salt,100).toString();
    }
    public static void main(String[] args) {
        //想要对admin这个密码进行加密.sha-256是不可逆的加密方式,对同一个密码生成的密文是唯一的,无论你执行多少次
        //注意这个盐是建议每个账户一个,尽量不要重复
        String newPwd = SHAUtil01.shaPassword("admim", "q1");
        System.out.println(newPwd);
    }
}
1.2.2 随机生成盐
a 核心代码
//①定义一个随机生成10位含字母数字符号的盐
static Random random=new Random();
public static String getSalt(){
    //盐从以下这些字符中去随机取出10个出来,下面盐的字符串是可以自定义的,专门弄一个方法拿到盐
    String salts="ewsfjbwdufgsfsnuivhe123456789/*;[]";
    StringBuffer salt=new StringBuffer();
    for (int i = 1; i <=10; i++) {
        //charAt是取出索引处的字符
        char c=salts.charAt(random.nextInt(salts.length()));
        salt.append(String.valueOf(c));
    }
    return salt.toString();
}
//②sha-256的加密方式(不可逆的)进行加密得到密文
public static String shaPassword(String oldPwd){
    return new SimpleHash("sha-256",oldPwd,getsalt(),100).toString();
}
b 完整代码
package com.zlz.util;

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

import java.util.Random;

public class SHAUtil02 {
    /**
     * 对密码使用sha-256算法的方式加密
     * 加密不可逆: 无法通过新生成密文来反推出原来的密码
     *
     * 盐是为了提高密码的安全系数的 随机生成的
     * 实际是拿你随机生成的盐和原来的字符串拼接在一起在来生成密文
     * 一般是可以使用随机字符串来表示盐的
     * hashIteration 表示加密计算的次数(拿盐和字符串拼接的次数) 散列次数越多 安全系越高
     * @param oldPwd 原密码
     * @return 字符串形式的密文
     */
    public static String shaPassword(String oldPwd){
        return new SimpleHash("sha-256",oldPwd,getSalt(),100).toString();
    }
    static Random random=new Random();
    public static String getSalt(){
        //盐从以下这些字符中去随机取出10个出来,下面盐的字符串是可以自定义的,专门弄一个方法拿到盐
        String salts="ewsfjbwdufgsfsnuivhe123456789/*;[]";
        StringBuffer salt=new StringBuffer();
        for (int i = 1; i <=10; i++) {
            //charAt是取出索引处的字符
            char c=salts.charAt(random.nextInt(salts.length()));
            salt.append(String.valueOf(c));
        }
        return salt.toString();
    }
    public static void main(String[] args) {
        //想要对admin这个密码进行加密.sha-256是不可逆的加密方式,对同一个密码生成的密文是唯一的,无论你执行多少次
        String newPwd = SHAUtil02.shaPassword("admin");
        System.out.println(newPwd);
    }
}
1.3 手动变更数据表(以自己指定盐的方式)
1.3.1 生成账户"admin"所对应的密文
a 测试代码
public static void main(String[] args) {
    //想要对admin这个密码进行加密.是不可逆的加密方式,对同一个密码生成的密文是唯一的,无论你执行多少次
    String newPwd = SHAUtil01.shaPassword("admin", "q1");
    System.out.println(newPwd);
}
b 运行截图

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

1.3.2 账户"aaa"所对应的密文
a 测试代码
public static void main(String[] args) {
    //想要对admin这个密码进行加密.是不可逆的加密方式,对同一个密码生成的密文是唯一的,无论你执行多少次
    String newPwd = SHAUtil01.shaPassword("aaa", "q2");
    System.out.println(newPwd);
}
b 运行截图

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

1.3.3 账户"bbb"所对应的密文
a 测试代码
public static void main(String[] args) {
    //想要对admin这个密码进行加密.是不可逆的加密方式,对同一个密码生成的密文是唯一的,无论你执行多少次
    String newPwd = SHAUtil01.shaPassword("bbb", "q3");
    System.out.println(newPwd);
}
b 运行截图

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

1.3.4 手动更改sys_user表的salt字段,更改后的效果如下所示

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

1.4 sys_user表所对应的sql语句(生成对应密文后的版本)
/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3305
 Source Server Type    : MySQL
 Source Server Version : 80030
 Source Host           : 127.0.0.1:3305
 Source Schema         : db0618

 Target Server Type    : MySQL
 Target Server Version : 80030
 File Encoding         : 65001

 Date: 15/01/2023 22:21:15
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` int NOT NULL,
  `username` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `password` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `salt` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `suo` int NULL DEFAULT 0,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, 'admin', '7e84f2fbdc9de493dc1e17c44b163ebc9168bc472f26db231f472f1012e62d87', 'q1', 0);
INSERT INTO `sys_user` VALUES (2, 'aaa', '18ae76b69e6b7b2ae78100013442beafb692bbbad663b1ff5845f0036b446ad7', 'q2', 0);
INSERT INTO `sys_user` VALUES (3, 'bbb', '7c8425aa02dfdfc973257f3b2a4ded786eadee830d7a29a900669727fa7a5966', 'q3', 1);

SET FOREIGN_KEY_CHECKS = 1;

2 在config包下创建域(MysqlRealm类)

package com.zlz.config;

import com.zlz.entity.SysUser;
import com.zlz.mapper.SysUserMapper;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

public class MysqlRealm extends AuthorizingRealm {
    //授权方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
        return null;
    }
    @Autowired
    SysUserMapper sysUserMapper;
    //认证方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken at) throws AuthenticationException {
        //①在认证方法里面获取输入的用户名
        String username = (String) at.getPrincipal();
        SysUser user = sysUserMapper.findUserByUsername(username);
        if (user == null) {
            //②如果账户不存在,就抛出账户不存在异常
            throw new UnknownAccountException();
        }
        //③检查账户是否锁定 如果锁定的话,那就会抛出锁定异常
        if(user.getSuo()==1){
            throw new LockedAccountException();
        }
        //密码错误,shiro会自动帮你抛出密码错误这个异常的
//        System.out.println("实例对象名称:");
        //④拿到盐(放在第三个形参的位置)-----变动的地方
        ByteSource salt = ByteSource.Util.bytes(user.getSalt());
        //⑤把对应的参数设置进去
        SimpleAuthenticationInfo s=new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),salt,getName());
        return s;
    }
}

3.在config包下创建ShiroConfig类(进行shiro的相关配置)

package com.zlz.config;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConig {
    //安全管理器的配置
    @Bean
    public DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager dws=new DefaultWebSecurityManager();
        dws.setRealm(mysqlRealm());
        //设置会话管理器,保证第一次访问的时候不会出错
        dws.setSessionManager(new DefaultWebSessionManager());
        return dws;
    }
    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean factoryBean(){
        ShiroFilterFactoryBean sffb=new ShiroFilterFactoryBean();
        //设置安全管理器
        sffb.setSecurityManager(securityManager());
        //设置需要登录但没有登录的地址
        sffb.setLoginUrl("");
        //检测到没有权限时的跳转地址
        sffb.setUnauthorizedUrl("");
        return sffb;
    }
    @Bean
    public MysqlRealm mysqlRealm(){
        MysqlRealm mysqlRealm=new MysqlRealm();
        //变动的地方: 配置加密管理器 登录时 会使用该加密方式对输入的密码进行加密,再和数据库的密码进行比对
        HashedCredentialsMatcher hsm = new HashedCredentialsMatcher();
        hsm.setHashAlgorithmName("sha-256");//加密方式 与注册时保持一致
        hsm.setHashIterations(100);//散列次数 与注册时保持一致
        mysqlRealm.setCredentialsMatcher(hsm);
        return mysqlRealm;
    }
}

4 最终测试

4.1 当账户输入有误时
a 点击登录按钮前

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

b 点击登录按钮后

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

4.2 当账户被锁定时
a 点击登录按钮前

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

b 点击登录按钮后

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

4.3 当密码输入有误时(该用户并没有被锁定)
a 点击登录按钮前

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

b 点击登录按钮后

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

4.4 当账户密码输入均正确时
a 点击登录按钮前

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式

b 点击登录按钮后

springboot使用sha256,spring boot学习篇,spring boot,shiro安全框架,登录实例——含密文存储,SHA-256加密方式文章来源地址https://www.toymoban.com/news/detail-755151.html

到了这里,关于Spring Boot学习篇(十)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Boot 源码学习】BootstrapContext的实际使用场景

    《Spring Boot 源码学习系列》 上一篇博文《BootstrapRegistry 初始化器实现》, Huazie 向大家介绍了如何自定义 BootstrapRegistryInitializer 接口实现,并以此来执行自定义的初始化操作【如注册自定义的 Bean 、添加 BootstrapContext 关闭监听器】。其中涉及到了 BootstrapContext 的部分使用场景

    2024年03月11日
    浏览(46)
  • Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

            随着大数据时代的到来,数据存储和处理变得越来越重要。而MongoDB作为一种非关系型数据库,具有高效的数据存储和处理能力,被越来越多地应用于各种领域。尤其在Web应用开发中,SpringBoot框架已经成为了主流选择之一。在这篇文章中,我们将探讨如何将MongoD

    2024年02月17日
    浏览(48)
  • 【Spring Boot】Spring Boot项目中如何查看springBoot版本和Spring的版本

    在项目中查看默认版本有两种方式如下 Spring Boot 的最新版本支持情况: 版本 发布时间 停止维护时间 停止商业支持 3.0.x 2022-11-24 2023-11-24 2025-02-24 2.7.x 2022-05-19 2023-11-18 2025-02-18 2.6.x 2021-12-17 2022-11-24 2024-02-24 2.5.x 2021-05-20 已停止 2023-08-24 2.4.x 2020-11-12 已停止 2023-02-23 2.3.x 2020-05-

    2024年02月11日
    浏览(99)
  • Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

            WebSocket是一种新型的通信协议,它可以在客户端与服务器端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。在SpringBoot应用中,集成WebSocket可以方便地实现实时通信功能,如即时聊天、实时数据传输等。         本文将介绍如何在Sprin

    2024年02月16日
    浏览(54)
  • Spring Boot学习随笔- 本地化测试(@SpringBootTest)、热部署(spring-boot-devtools)、日志Logback常用级别使用、指定包级别输出

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 频繁启动服务器进行功能的访问非常繁琐、SpringBoot给我们提供了用于测试的依赖,自动集成Junit,使用了这个以来后,test包在打包时不会被打包进去 @SpringBootTest注解 修饰在类上,用来启动本地Spring环境 作用 热部署是指

    2024年02月05日
    浏览(79)
  • 【Spring Boot学习】Spring Boot的创建,第一个Spring Boot页面.

    前言: 大家好,我是 良辰丫 ,前面几篇文章,我们系统的学习了Spring框架,今天开始,我们就要学习更高级的SpringBoot框架了,不要着急哦,我们一起畅游SpringBoot框架的世界.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生活也许会让我们遍体

    2024年02月08日
    浏览(54)
  • Spring Boot Testing: 使用springboot-test提供的测试框架来实现自动化测试

    作者:禅与计算机程序设计艺术 软件测试是在开发过程中不可缺少的一环。单元测试、集成测试、功能测试等都是为了保证系统的质量而进行的测试活动。单元测试主要验证各个模块(类、方法)在各种情况下是否正常工作;集成测试则是将不同模块组合起来看是否可以正常

    2024年02月07日
    浏览(44)
  • SpringBoot整理-Spring Boot配置

    Spring Boot 的配置系统是其核心功能之一,旨在简化 Spring 应用的配置过程。Spring Boot 提供了一种灵活的方式来配置你的应用,无论是通过外部配置文件,环境变量,命令行参数还是在代码中直接配置。以下是关于 Spring Boot 配置的几个重要方面: 配置文件 application.prop

    2024年01月25日
    浏览(55)
  • 【Spring Boot】SpringBoot 单元测试

    单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 1、可以⾮常简单、直观、快速的测试某⼀个功能是否正确。 2、使⽤单元测试可以帮我们在打包的时候,发现⼀些问题,因为在打包之前,所以的单元测试必须通过,否则不能打包

    2024年02月07日
    浏览(57)
  • SpringBoot整理-Spring Boot与Spring MVC的区别

    Spring Boot 和 Spring MVC 是 Spring 框架的两个不同部分,它们在 Java Web 开发中扮演着各自独特的角色。理解它们之间的区别有助于更好地利用 Spring 生态系统进行有效的应用开发。 Spring MVC 定义:  Spring MVC 是基于 Model-View-Controller(模型-视图-控制器)设计模式的一个 

    2024年01月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包