认证中心扩展兼容已有系统密码

环境说明

依赖项版本
PIGX5.6
架构模式微服务

背景概述

① PIGX 默认的密码加解密策略

PIGX 默认使用 Bcrypt 进行不可逆加密,即通过用户输入的明文加密后与数据库中的密文进行比对判断密码是否正确,但无法将密文解密成明文。

默认加解密 Bcrypt加密示意

② 业务需求

在当前登录系统中,sys_user 表的用户数据需要复用已有系统的用户和密码信息,因此要求密码的加解密过程支持自定义算法。

业务需求示意 假设:原系统的密码存储算法为 SM4(此处作为示例算法,实际实现可依据原理扩展支持其他算法)。

实现兼容性改造

① 增加自定义密码加解密逻辑

将自定义密码加解密类放置于 pigx-auth 认证中心模块。

package com.pig4cloud.pigx.auth.support.core;

import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;
import org.springframework.security.crypto.password.PasswordEncoder;

public class CustomPasswordEncoder implements PasswordEncoder {

    /**
     * SM4对称加密算法(演示用途,实际场景请根据安全需求调整)
     */
    private static SM4 sm4 = SmUtil.sm4("pigxpigxpigxpigx".getBytes(StandardCharsets.UTF_8));

    /**
     * 对前端输入的明文密码进行加密
     *
     * @param inputPassword 前端输入的明文
     * @return 加密后的密文
     */
    @Override
    public String encode(CharSequence inputPassword) {
        return sm4.encryptBase64(inputPassword.toString());
    }

    /**
     * 密码匹配逻辑:将输入的明文密码加密后与数据库存储的密文进行比对
     *
     * @param inputPassword 用户输入的密码
     * @param dbPassword    数据库存储的密文
     * @return 是否匹配
     */
    @Override
    public boolean matches(CharSequence inputPassword, String dbPassword) {
        String encodedPassword = encode(inputPassword);
        return encodedPassword.equals(dbPassword);
    }
}

② 配置自定义的 PasswordEncoder

PigxDaoAuthenticationProvider 中注入自定义的 PasswordEncoder

PasswordEncoder配置

③ 修改核心认证逻辑

PigxUserDetailsService 中创建 PigxUser 时,省去对密码的 Bcrypt 前缀拼接,直接处理自定义算法加密后的密文。

核心认证逻辑调整

清理缓存并重启系统

清空 Redis 缓存并重新启动服务以应用新配置。

mvn clean install