我们在前一篇文章中实现了cas4.2.x登录使用mongodb验证方式。

单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程

也学习参考了cas5.0.x版本的mongodb的四种加密方式。

单点登录(十四)-----实战-----cas5.0.x登录mongodb验证方式常规的四种加密的思考和分析

结合到cas 4.2.x的代码情况我们发现需要修改MongoAuthenticationHandler.java部分的代码才可以实现自定义加密。

主要思路是我们需要新建一个class 实现org.pac4j.http.credentials.password.PasswordEncoder接口。

然后让MongoAuthenticator验证的时候使用这个加密class即可。

详细步骤参考如下(我们这里来实现cas5.0中的DefaultPasswordEncoder的MD5加密):

新建一个名为DefaultPasswordEncoderMD5的class实现org.pac4j.http.credentials.password.PasswordEncoder接口,并且把org.jasig.cas.authentication.handler包中的DefaultPasswordEncoder实现粘贴过来如下:

package org.jasig.cas.authentication;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.lang3.StringUtils;
import org.pac4j.http.credentials.password.PasswordEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DefaultPasswordEncoderMD5 implements PasswordEncoder{

	    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
	                                                '9', 'a', 'b', 'c', 'd', 'e', 'f'};
	    private static final int HEX_RIGHT_SHIFT_COEFFICIENT = 4;
	    private static final int HEX_HIGH_BITS_BITWISE_FLAG = 0x0f;

	    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultPasswordEncoderMD5.class);

	    private final String encodingAlgorithm="MD5";

	    private String characterEncoding="UTF-8";

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

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

	        try {
	            final MessageDigest messageDigest = MessageDigest.getInstance(this.encodingAlgorithm);

	            final String encodingCharToUse = StringUtils.isNotBlank(this.characterEncoding)
	                    ? this.characterEncoding : Charset.defaultCharset().name();

	            LOGGER.warn("Using {} as the character encoding algorithm to update the digest", encodingCharToUse);
	            messageDigest.update(password.getBytes(encodingCharToUse));

	            final byte[] digest = messageDigest.digest();

	            return getFormattedText(digest);
	        } catch (final NoSuchAlgorithmException e) {
	            throw new SecurityException(e);
	        } catch (final UnsupportedEncodingException e) {
	            throw new RuntimeException(e);
	        }
	    }

	    /**
	     * Takes the raw bytes from the digest and formats them correct.
	     *
	     * @param bytes the raw bytes from the digest.
	     * @return the formatted bytes.
	     */
	    private static String getFormattedText(final byte[] bytes) {
	        final StringBuilder buf = new StringBuilder(bytes.length * 2);

	        for (int j = 0; j < bytes.length; j++) {
	            buf.append(HEX_DIGITS[(bytes[j] >> HEX_RIGHT_SHIFT_COEFFICIENT) & HEX_HIGH_BITS_BITWISE_FLAG]);
	            buf.append(HEX_DIGITS[bytes[j] & HEX_HIGH_BITS_BITWISE_FLAG]);
	        }
	        return buf.toString();
	    }

	    public void setCharacterEncoding(final String characterEncoding) {
	        this.characterEncoding = characterEncoding;
	    }

}

加密类有了,我们就可以在MongoAuthenticator验证的时候使用了。

需要修改MongoAuthenticationHandler.java里的两个地方。

private org.pac4j.http.credentials.password.PasswordEncoder mongoPasswordEncoder = new NopPasswordEncoder();

修改为新建我们的新class如下:

private org.pac4j.http.credentials.password.PasswordEncoder mongoPasswordEncoder = new DefaultPasswordEncoderMD5();

然后

final MongoAuthenticator mongoAuthenticator = new MongoAuthenticator(client, this.attributes);

中使用这个验证如下:

final MongoAuthenticator mongoAuthenticator = new MongoAuthenticator(client, this.attributes,mongoPasswordEncoder );

即可。

运行程序,这样我们的登录密码就会先根据encode的方法加密后才跟数据库中的密码作对比。

这样我们就实现了自定义加密了。

最新文章

  1. Android之SAX解析XML
  2. webserver几个例子
  3. css3中transition和animation的回调处理
  4. javascript数组 去重
  5. MySQL把多个字段合并成一条记录的方法
  6. UITableView的性能优化10个小技巧
  7. Redis脚本插件之————执行Lua脚本示例
  8. python 练习 5
  9. tab模块
  10. 【转】itunes connect 如何修改主要语言
  11. Scut:通用配置管理器
  12. CentOS安装JDK 8
  13. 根据HTML5的新方法 drag &amp; drop 方法实现表格拖拽实例
  14. Python之使用转义序列 \n 和 \t 跟 expandtabs 函数输出表格
  15. sort简单用法
  16. 深度学习框架比较TensorFlow、Theano、Caffe、SciKit-learn、Keras
  17. react暴露webpack配置文件
  18. pyqtgraph
  19. 【PyQt5-Qt Designer】工具箱(QToolBox)控件的使用
  20. SAP应用创新-维护控制表、视图统一路径

热门文章

  1. Netty源码分析第3章(客户端接入流程)----&gt;第1节: 初始化NioSockectChannelConfig
  2. yocto-sumo源码解析(七): BitBakeServer
  3. xlrd模块学习
  4. mysql 官方集群
  5. FileInputStream 读取文件数据的输入字节流
  6. bata3
  7. Leetcode题库——12.整数转罗马数字
  8. Unity3D游戏开发——收集当前关卡游戏中分散的物件
  9. 第二章 Socket用法详解
  10. 打开ubuntu终端的两个方法【最快速】