【CAS定制】定制化密码编码器--支持密码组合编码或加密 PasswordEncoder

news2025/2/23 6:23:48

CAS中,默认支持的PasswordEncoder只能通过一种密码算法进行编码或加密,但是日常场景经常存在组合编码的需求,这就需要我们去定制一种支持密码组合编码或加密的编码器。


文章目录

  • 场景
  • 定制目标
  • 定制方案
  • 定制代码


场景

一般项目中有很多需要进行组合编码或加密的场景:如

用户在前端输入密码后,前端先进行一次md5编码,后端进行密码校验的时候,再进行一次sha1编码,最后再与数据库的值进行比对。

对于这些场景,CAS系统中默认的密码编码器DefaultPasswordEncoder已经无法实现需求,需要进行定制。

定制目标

  • 能支持密码组合编码或加密。
  • 改动尽可能少,不影响其它功能。

定制方案

  • 不改动PasswordEncoderProperties配置映射,只对其中encodingAlgorithm字段进行特殊解析。
  • 如果encodingAlgorithm字段包含指定的前缀,则认为需要组合加密,进行组合加密的逻辑。如果不包含,则使用默认逻辑。
  • 具体组合加密逻辑为,通过分隔符分割出所有需要组合加密的算法,依次进行编码或加密。

定制代码

注意事项:

  • 重写默认的DefaultPasswordEncoder

  • 请将日志工具替换为cas的日志工具或自己的日志工具。

import com.atfwus.*****.util.log.LoggingUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * @author atfwus
 * @ClassName DefaultPasswordEncoder
 * @description: 默认密码加密器
 * @date 2023.08.04
 * @version: 1.0
 */
@Slf4j
@RequiredArgsConstructor
public class DefaultPasswordEncoder implements PasswordEncoder {
    private final String encodingAlgorithm;
    private final String characterEncoding;
    private final String COMBINE_PREFIX = "COMBINE::";

    private final String SPLIT_CHARACTER = ",";

    private String oneEncode(final CharSequence password, String oneEncodingAlgorithm) {
        val encodingCharToUse = StringUtils.isNotBlank(this.characterEncoding)
                ? this.characterEncoding : Charset.defaultCharset().name();

        log.debug("Using [{}] as the character encoding algorithm to update the digest", encodingCharToUse);

        try {
            val pswBytes = password.toString().getBytes(encodingCharToUse);
            val encoded = Hex.encodeHexString(DigestUtils.getDigest(oneEncodingAlgorithm).digest(pswBytes));
            log.debug("Encoded password via algorithm [{}] and character-encoding [{}] is [{}]", oneEncodingAlgorithm,
                    encodingCharToUse, encoded);
            return encoded;
        } catch (final Exception e) {
            LoggingUtils.error(log, e);
        }
        return null;
    }

    @Override
    public String encode(final CharSequence password) {
        if (password == null) {
            return null;
        }

        if (StringUtils.isBlank(this.encodingAlgorithm)) {
            log.warn("No encoding algorithm is defined. Password cannot be encoded; Returning null");
            return null;
        }

        if(this.encodingAlgorithm.startsWith(COMBINE_PREFIX)) {
            CharSequence encoded = password;
            String[] algorithms = this.encodingAlgorithm.substring(COMBINE_PREFIX.length()).split(SPLIT_CHARACTER);
            return Arrays.stream(algorithms)
                    .reduce(encoded, this::oneEncode, (result1, result2) -> result2)
                    .toString();
        } else {
            return oneEncode(password, this.encodingAlgorithm);
        }
    }

    @Override
    public boolean matches(final CharSequence rawPassword, final String encodedPassword) {
        val encodedRawPassword = StringUtils.isNotBlank(rawPassword) ? encode(rawPassword.toString()) : null;
        val matched = StringUtils.equals(encodedRawPassword, encodedPassword);
        val msg = String.format("Provided password does%smatch the encoded password",
                BooleanUtils.toString(matched, StringUtils.EMPTY, " not "));
        log.debug(msg);
        return matched;
    }
}

在配置文件中,对需要用到PasswordEncoder的地方进行类似如下的配置,即可实现组合编码或加密。

在这里插入图片描述


ATFWUS 2023-08-09

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP协议讲解

HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在欧洲核…

贝锐蒲公英:智能组网助力企业智慧工地信息化建设

随着现代信息化技术的不断发展,为了让企业工地施工管理、监督更为高效、精准,及时发现并处理工地单位施工中的安全和质量问题,视频监控已成为“智慧工地”建设中不可或缺的重要环节。 视频监控系统主要通过安装摄像头对施工现场进行实时监控和…

RK3568蓝牙程序开发过程

1、搭建蓝牙开发环境 蓝牙开发可以使用C语言开发或python语言开发,使用的是蓝牙开发库为bluez库。 本文开发使用python语言开发,安装bluez库,可以使用pip install PyBluez来安装。 如果安装不上的话,可以使用sudo apt install pyt…

Springboot中拦截GET请求获取请求参数验证合法性

目录 目的 核心方法 完整代码 创建拦截器 注册拦截器 测试效果 目的 在Springboot中创建拦截器拦截所有GET类型请求,获取请求参数验证内容合法性防止SQL注入(该方法仅适用拦截GET类型请求,POST类型请求参数是在body中,所以下面…

ADB连接安卓手机提示unauthorized

近期使用airtest进行自动化测试时,因为需要连接手机和电脑端,所以在使用adb去连接本人的安卓手机vivo z5时,发现一直提示unauthorized。后来经过一系列方法尝试,最终得以解决。 问题描述: 用数据线将手机接入电脑端&…

数据分析 绘图工具

prism呢… 拼dd上看到卖prism的终身包 GraphPad Prism GraphPad Prism 就是为生物科研统计作图而生的一款数据处理绘图软件,它不仅能分析数据,还能快速作图,简直是科研人的福音! GraphPad 最新版本拥有最新的气泡图&#xff0…

Springboot中使用过滤器校验PSOT类型请求参数内容

目录 目的 实现步骤 完整代码 目的 在Springboot中创建过滤器,用来过滤所有POST类型请求并获取body中的参数进行校验内容是否合法;该方法仅适用于POST类型请求,因为POST和GET请求的参数位置不一样所以处理方式也不一样,如果想要…

恒盛策略:早盘A股三大指数表现分化 CRO概念板块逆势涨超6%

周三(8月9日),A股三大指数体现分化,到上午收盘,上证指数跌0.36%,报3249.02点;深证成指跌0.28%,创业板指涨0.24%;沪深两市合计成交额4550.78亿元,总体来看&…

DARPA-TC-engagement5-theia部分数据格式分析

转换出来的jsons数据主要分为四大类:Event、Subject、Object和Principal,分别代表系统事件、主体、客体和用户。各种大类中子类的数量,取决于CDM的版本。ShadeWatcher使用的是e3的数据,采用的是CDM18,而e5默认使用的是…

HTTP——十一、Web的攻击技术

HTTP 一、针对Web的攻击技术1、HTTP 不具备必要的安全功能2、在客户端即可篡改请求3、针对Web应用的攻击模式 二、因输出值转义不完全引发的安全漏洞1、跨站脚本攻击2、SQL 注入攻击3、OS命令注入攻击4、HTTP首部注入攻击5、邮件首部注入攻击6、目录遍历攻击7、远程文件包含漏洞…

Win10的日历软件中怎么新增日程安排及提醒?

在经济发展加速的时代,职场中做好时间管理的重要性不言而喻,而想要在工作中做好时间管理,关键在于按时完成每项日程安排。所以每天在使用win10电脑办公时新增日程安排并设置提醒不仅是非常有必要的,而且是提高效率和生活质量的重要…

Java课题笔记~ JavaWeb概述/开发基础

JavaWeb概述/开发基础 1.XML基础 (1)XML概述 (2)XML语法 (3)DTD约束 (4)Schema约束(XML Schema 比 DTD 更强大) 2.Web基础知识 Web是一个分布式的超媒…

Celery的基本使用

1.Celery介绍 1.1 Celery是什么? Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块专注于实时处理的异步任务队列同时也支持任务调度 Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Ce…

设置height:100%无效的原因以及两种解决方法

原因&#xff1a;我们知道在把盒子宽度自适应为浏览器窗口宽度&#xff0c;只需设置width:100%就可轻松解决问题&#xff0c;但是让盒子的高度自适应浏览窗口的高度并非那么容易&#xff0c;这是因为css内部计算的原因 <!-- 高度实际为字体大小 --> <div class"…

ElasticSearch:环境搭建步骤

1、拉取镜像 docker pull elasticsearch:7.4.0 2、创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.typesingle-node" elasti…

logo设计用什么工具比较好?为你推荐这9个

在海报设计工作中&#xff0c;logo设计是必不可少的一步&#xff0c;今天本文为大家推荐9个特别好用的logo生成器&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时灵感是一个结合了AI技术的logo生成器&#xff0c;它无需设计师提供设计素材&#xff0c;只要在文本框中…

软件系统测试报告

1.简介 1.1.编写目的 本文档是对重庆市XXX项目验收测试所做的说明&#xff0c;为充分利用已有的软硬件资源&#xff0c;配合对系统应用模块的运行测试方案,查缺补漏完善系统的各项具体功能,保证项目的顺利进行&#xff0c;本测试报告有助于实现以下目标&#xff1a; 明确本次…

【Linux命令详解 | grep命令】 grep命令用于在文件中搜索指定模式的文本,功能强大且常用

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 使用基本模式搜索2. 忽略大小写匹配3. 反向匹配4. 递归搜索目录5. 显示文件名6. 显示行号7. 显示上下文行8. 启用扩展正则表达式9. 将模式视为固定字符串10. 使用颜色高亮显示匹配文本 总结 简介 在Linux系统中&…

12v转5v降压模块

问&#xff1a;什么是12V转5V降压模块&#xff1f;它的功能是什么&#xff1f; 答&#xff1a;12V转5V降压模块是一种电子设备&#xff0c;用于将输入电压为12V的直流电转换为输出电压为5V的直流电。它的主要功能是为电子设备提供所需的适当电压&#xff0c;以便它们能够正常运…

AI里的烟火气:实在RPA数字员工频频上岗九阳、海尔、美的等多家上市家电企业

1994年&#xff0c;九阳创始人王旭宁研发出了世界上第一台豆浆机&#xff0c;他将原本需要耗费七八个小时来泡豆子、推磨、过滤、蒸煮的时间&#xff0c;缩短到了几分钟。这是生产力的一次重大进步&#xff0c;也标志着九阳这样一家品质小家电领导品牌&#xff0c;开始走入大众…