Springboot简单功能示例-4 自定义加密进行登录验证

springboot,简单,功能,示例,自定义,加密,进行,登录,验证 · 浏览次数 : 27

小编点评

**springboot-sample介绍** **简单示例跳转到发行版查看发行版说明软件架构** 该示例演示了如何在 Spring Boot 应用中使用 SM2 库对用户密码进行加密验证和登录验证。 **功能说明** 1. 使用 BCprov-jdk18on 库对用户密码进行 sm2 签名验证。 2. 使用 SM2 库对用户密码进行登录验证。 3. 如果用户不存在,则返回一个 401 错误响应。 4. 如果密码验证失败,则返回一个 400 错误响应,包含错误信息。 5. 用户登录成功后,跳转到发行版首页。 **代码示例** **CustomPasswordEncoder.java** ```java @Component public class CustomPasswordEncoder { private final SM2PasswordEncoder sm2PasswordEncoder; public CustomPasswordEncoder(SM2PasswordEncoder sm2PasswordEncoder) { this.sm2PasswordEncoder = sm2PasswordEncoder; } public boolean matches(CharSequence rawPassword, String encodedPassword) throws UsernameNotFoundException, BadCredentialsException { return sm2PasswordEncoder.matches(rawPassword.toString(), encodedPassword, KeyUtils.STR_UUID); } } ``` **JwtUserDetailsService.java** ```java @Service public class JwtUserDetailsService implements UserDetailsService { private final Sm2PasswordEncoder sm2PasswordEncoder; public JwtUserDetailsService(Sm2PasswordEncoder sm2PasswordEncoder) { this.sm2PasswordEncoder = sm2PasswordEncoder; } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 从数据库中读取用户注册信息,并使用 SM2 密码加密 // 并返回一个 JwtUserDetails 对象 return null; } } ``` **WebSecurityConfig.java** ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { // 设置密码加密器 httpSecurity.passwordEncoder(CustomPasswordEncoder.class); // 配置 JWT 认证 httpSecurity.authentication().addAuthentication(JwtAuthenticationFilter.builder().build()); // 配置自定义密码校验器 httpSecurity.addAuthentication(CustomUserDetailsService.class); } } ``` **运行示例** 1. 在 Spring Boot 应用的 `bootstrap.properties` 中设置 `spring.security.crypto.password-encoder` 属性。 2. 在 `application.yml` 中设置 `security.jwt.enabled` 属性为 `true`。 3. 启动 Spring Boot 应用。 4. 在浏览器中打开 `localhost:8080/login` 链接,并输入用户名和密码。 5. 如果密码正确,用户将成功登录到发行版首页。

正文

springboot-sample

介绍

springboot简单示例 跳转到发行版 查看发行版说明

软件架构(当前发行版使用)

  1. springboot
  2. hutool-all 非常好的常用java工具库 官网 maven
  3. bcprov-jdk18on 一些加密算法的实现 官网 maven

安装教程

git clone --branch 4.自定义加密进行登录验证 git@gitee.com:simen_net/springboot-sample.git
 

功能说明

使用bcprov-jdk18on的sm2加密算法对用户密码进行签名及认证

发行版说明

  1. 完成基本WEB服务 跳转到发行版
  2. 完成了KEY初始化功能和全局错误处理 跳转到发行版
  3. 完成了基本登录验证 跳转到发行版
  4. 完成了自定义加密进行登录验证 跳转到发行版 查看发行版说明
 
 

自定义加密进行登录验证

使用SM2库对密码进行签名验证

  1. 新建自定义加密编码器Sm2PasswordEncoder.java,使用KeyUtils中的SM2加密对象进行签名验证:SM2_OBJ.verifyHex(rawPassword.toString(),encodedPassword,KeyUtils.STR_UUID)
  2. SystemController中的@GetMapping("/login")中将SPRING_SECURITY_LAST_EXCEPTION的错误消息注入login.ftl
  3. 新建JwtUserDetailsJwtUserDetailsService类,重写用户验证对象的实现和用户验证功能实现
  4. WebSecurityConfig中,定义DaoAuthenticationProvider使用Sm2PasswordEncoder编码器、JwtUserDetailsService用户验证服务

代码逻辑说明

  1. JwtUserDetailsService中可以从数据库中读取用户注册信息
    • 在代码中硬注册simen、admin两个用户,强制密码签名为SM2_OBJ.signHex("123456", KeyUtils.STR_UUID)
    • 当用户不存在时return new JwtUserDetails();
  2. Sm2PasswordEncoder.java中的public boolean matches(CharSequence rawPassword, String encodedPassword)
    • 判断rawPassword或者encodedPassword为空,则throw new UsernameNotFoundException("用户不存在");
    • 校验密码签名false时throw new BadCredentialsException("账号密码验证失败")
    • 抛出异常的目的是为了在login.ftl中显示正确的错误消息

与Springboot简单功能示例-4 自定义加密进行登录验证相似的内容:

Springboot简单功能示例-4 自定义加密进行登录验证

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】使用bcprov-jdk18on的sm2加密算法对用户密码进行签名及认证

Springboot简单功能示例-1 实现基本WEB服务

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。 其中博主还将尝试统一异常处理、自定义加密认证、代码自动生成等功能

Springboot简单功能示例-2 KEY初始化功能和全局错误处理

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】KEY初始化功能和全局错误处理

Springboot简单功能示例-3 实现基本登录验证

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】使用spring-security6.1.3,抛弃了WebSecurityConfigurerAdapter的配置方式,直接使用session实现基本的登录验证功能

Springboot简单功能示例-5 使用JWT进行授权认证

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】使用JWT规范完成登录、确权、登出等操作,分别对html请求和json请求进行处理

Springboot简单功能示例-6 使用加密数据源并配置日志

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】配置logback;配置了数据源,对数据库账号密码进行加密;增加了系统启动配置

简单进行Springboot Beans归属模块单元的统计分析方法

简单进行Springboot Beans归属模块单元的统计分析方法 背景 基于Springboot的产品变的复杂之后 启动速度会越来越慢. 公司同事得出一个结论. beans 数量过多会导致启动速度逐渐变慢. 之前同事写过功能进行分析. 但是本着能不影响产品就不影响产品. 我想通过其他方式进行处理.

SpringBoot+mail 轻松实现各类邮件自动推送

一、简介 在实际的项目开发过程中,经常需要用到邮件通知功能。例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多。 早期的时候,为了能实现邮件的自动发送功能,通常会使用 JavaMail 相关的 api 来完成。后来 Spring 推出的 JavaMailSender 工具,进

SpringBoot内置tomcat启动过程及原理

作者:李岩科 1 背景 SpringBoot 是一个框架,一种全新的编程规范,他的产生简化了框架的使用,同时也提供了很多便捷的功能,比如内置 tomcat 就是其中一项,他让我们省去了搭建 tomcat 容器,生成 war,部署,启动 tomcat。因为内置了启动容器,应用程序可以直接通过 Mave

[转帖]Skywalking学习及整合springboot

目录 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要特性 4. Skywalking架构简介 5. Spring Cloud与Skywalking实战 5.1 Skywalking部署构建 5.3 Spring Cloud整合Skywalking实