cas5.3.2单点登录-自定义密码认证(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34021712/article/details/80958614

原文地址,转载请注明出处: 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.security</groupId>
    <artifactId>spring-security-core</artifactId>
</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);
    }
}

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

#配置加密策略
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

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

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

<AsyncLogger name="com.cas.CustomPasswordEncoder" level="info" includeLocation="true">
    <AppenderRef ref="casConsole"/>
</AsyncLogger>

测试

使用admin/123456登录,打印如下日志
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_34021712/article/details/80958614