本文共 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); }}
#配置加密策略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
只是在控制台打印,看一下效果
使用admin/123456登录,打印如下日志