原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/80958614 ©王赛超
上一篇博客,我们搞定了从数据库获取信息,并且对密码进行MD5加密 或者 加盐方式处理.假如某些特殊情况下,密码规则不符合以上,我们就需要自定义密码校验。
https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties-Common.html#password-encoding
CAS在身份验证处理,基本都是基于Spring Security对密码编码,
如果您计划设计自己的密码编码器或编写脚本来执行此操作,则可能还需要确保覆盖在运行时具有以下模块:
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-coreartifactId>
dependency>
如果需要设计自己的密码编码方案,其中类型被指定为完全限定的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);
}
}
#配置加密策略
cas.authn.jdbc.query[0].passwordEncoder.type=com.cas.CustomPasswordEncoder
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
只是在控制台打印,看一下效果
<AsyncLogger name="com.cas.CustomPasswordEncoder" level="info" includeLocation="true">
<AppenderRef ref="casConsole"/>
AsyncLogger>