单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密
我们在前一篇文章中实现了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的方法加密后才跟数据库中的密码作对比。
这样我们就实现了自定义加密了。
最新文章
- Android之SAX解析XML
- webserver几个例子
- css3中transition和animation的回调处理
- javascript数组 去重
- MySQL把多个字段合并成一条记录的方法
- UITableView的性能优化10个小技巧
- Redis脚本插件之————执行Lua脚本示例
- python 练习 5
- tab模块
- 【转】itunes connect 如何修改主要语言
- Scut:通用配置管理器
- CentOS安装JDK 8
- 根据HTML5的新方法 drag &; drop 方法实现表格拖拽实例
- Python之使用转义序列 \n 和 \t 跟 expandtabs 函数输出表格
- sort简单用法
- 深度学习框架比较TensorFlow、Theano、Caffe、SciKit-learn、Keras
- react暴露webpack配置文件
- pyqtgraph
- 【PyQt5-Qt Designer】工具箱(QToolBox)控件的使用
- SAP应用创新-维护控制表、视图统一路径