博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cas5.3.2单点登录-自定义密码认证(三)
阅读量:3784 次
发布时间:2019-05-22

本文共 2784 字,大约阅读时间需要 9 分钟。

原文地址,转载请注明出处:      © 

上一篇博客,我们搞定了从数据库获取信息,并且对密码进行MD5加密 或者 加盐方式处理.假如某些特殊情况下,密码规则不符合以上,我们就需要自定义密码校验。

参考官网

CAS在身份验证处理,基本都是基于Spring Security对密码编码,
如果您计划设计自己的密码编码器或编写脚本来执行此操作,则可能还需要确保覆盖在运行时具有以下模块:

org.springframework.security
spring-security-core

如果需要设计自己的密码编码方案,其中类型被指定为完全限定的Java类名,则类的结构将类似于以下内容:

package org.example.cas;import org.springframework.security.crypto.codec.*;import org.springframework.security.crypto.password.*;public class MyEncoder extends AbstractPasswordEncoder {
@Override protected byte[] encode(CharSequence rawPassword, byte[] salt) { return ... }}

以上来自官网内容,通过查看Spring Security的AbstractPasswordEncoder源码,发现AbstractPasswordEncoder抽象类实现了PasswordEncoder接口,实现任意一个都可以。并且内部有encode重载方法,一个返回String类型,一个返回byte[]类型。还有一个matches返回对比结果。下面是我们实现PasswordEncoder并重写encode和matches方法。

自定义密码认证类

package com.cas;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.security.crypto.password.PasswordEncoder;import java.math.BigInteger;import java.security.MessageDigest;/** * @author: wangsaichao * @date: 2018/7/8 * @description: 自定义密码验证 */public class CustomPasswordEncoder implements PasswordEncoder{
private final Logger logger = LoggerFactory.getLogger(CustomPasswordEncoder.class); /** * 对密码进行加密 * @param rawPassword * @return */ @Override public String encode(CharSequence rawPassword) { try { //对数据进行md5加密 MessageDigest md = MessageDigest.getInstance("MD5"); md.update(rawPassword.toString().getBytes()); String pwd = new BigInteger(1, md.digest()).toString(16); logger.info("encode方法:加密前( {} ),加密后( {} )",rawPassword,pwd); return pwd; } catch (Exception e) { logger.error("对密码进行md5异常",e); return null; } } /** * 判断密码是否匹配 * @param rawPassword * @param encodedPassword * @return */ @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { // 判断密码为空,直接返回false if (StringUtils.isBlank(rawPassword)) { return false; } //调用上面的encode 对请求密码进行MD5处理 String pass = this.encode(rawPassword.toString()); logger.info("matches方法:请求密码为:{} ,数据库密码为:{},加密后的请求密码为:{}",rawPassword,encodedPassword,pass); //比较密码是否相等 return pass.equals(encodedPassword); }}

修改application.properties 文件,将passwordEncoder.type改为自己的实现类

#配置加密策略cas.authn.jdbc.query[0].passwordEncoder.type=com.cas.CustomPasswordEncodercas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

在log4j2.xml中添加以下配置,否则不打印日志

只是在控制台打印,看一下效果

测试

使用admin/123456登录,打印如下日志

这里写图片描述

你可能感兴趣的文章
自学记录- 在Mac上学写python的hello world part one
查看>>
自学记录- 在Mac上学写python的hello world part two
查看>>
在python中遇到的问题
查看>>
shell脚本
查看>>
Jmeter Beanshell 高阶使用
查看>>
Mac 从jmeter安装到实际操作验证压力测试的全流程记录(未完结-开发正在部署服务器,边搞边记录)
查看>>
Mac 搭建appium+android+VS编译器的app UI自动化(真机)
查看>>
Mac python +vs code +Django 创建一个web项目(包含Django安装不成功的解决办法)
查看>>
解决问题-1
查看>>
解决问题-2【java.io.IOException: Server returned HTTP response code: 500 for URL】
查看>>
自学记录3 认识python的元组 元组练习题
查看>>
shell 脚本链接mysql 做增删改查
查看>>
Python基础 - 20210425 - 基础(命名规范,注解,基础语法)
查看>>
Python基础 - 20210427 - 基础2(字符串的操作)
查看>>
Python基础 - 20210429 - 基础3 (列表,元组)
查看>>
Python基础 - 20210502 - 基础4 (字典,集合,运算,浮点数的精度控制)
查看>>
Python基础 - 20210508 - 基础5 (if条件控制,debug)
查看>>
Python基础 - 20210511 - 基础6 (while循环,for循环)
查看>>
Python基础 - 20210514 - 基础7(函数-1)
查看>>
Python基础 - 20210515 - 基础8(函数-2)
查看>>