我们在前一篇文章中实现了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的方法加密后才跟数据库中的密码作对比。

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

单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密的更多相关文章

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

    我们在上一篇文章中已经讲解了cas4.2.X登录启用mongodb验证方式 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程 但是密码是明文存储的,也就是 ...

  2. 单点登录(十七)----cas4.2.x登录mongodb验证方式成功后返回更多信息更多属性到客户端

    我们在之前已经完成了cas4.2.x登录使用mongodb验证方式登录成功了.也解决了登录名中使用中文乱码的问题. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方 ...

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

    我们在之前的文章中中已经讲到了正确部署运行cas server 和 在cas client中配置. 在此基础上 我们去掉了https的验证,启用了http访问的模式. 单点登录(七)-----实战-- ...

  4. 单点登录(十二)-----遇到问题-----cas启用mongodb验证方式登录后没反应-pac4j-mongo包中的MongoAuthenticatInvocationTargetException

    cas启用mongodb验证方式登录后没反应 控制台输出 2017-02-09 20:27:15,766 INFO [org.jasig.cas.authentication.MongoAuthent ...

  5. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

  6. 单点登录(十)-----遇到问题-----cas启用mongodb验证方式报错com.mongodb.CommandFailureException---Authentication failed

    cas启用mongodb验证方式报错com.mongodb.CommandFailureException---Authentication failed. 完整报错信息: 二月 08, 2017 5 ...

  7. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  8. 十五天精通WCF——第九天 高级玩法之自定义Behavior

    终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...

  9. 单点登录(十一)-----遇到问题-----cas启用mongodb验证方式报错--Unable to locate Spring NamespaceHandler for XML schema na

    cas启用mongodb验证方式报错--Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.sp ...

随机推荐

  1. python的eval和json.loads(),json.dumps()

    eval() 将字符串当成一个表达式去执行,可以想象成一个去字符串然后执行的操作. In [1]: s = '3*8' In [2]: eval(s) Out[2]: 24 eval()和json.l ...

  2. Ruby知识点二:类

    1.追查对象是否属于某个类时,使用is_a?方法  追查某个对象属于哪个类时,使用class方法 判断某个对象是否属于某个类时,使用instance_of?方法 判断类是否包含某个模块,使用inclu ...

  3. Beta发布 _thunder_文案+美工展示

    作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1366 团队介绍:thunder 组成员及各位博客地址: 1.王航:htt ...

  4. (第十周)新NABCD

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 新的NABCD模型: Need:可以辅助教师课堂讲授食物链相关的知识.软件的界面要漂亮,操作要简单,要给出软件 ...

  5. OO第三次阶段总结

    (1)调研,规格化设计的大致发展和为什么得到人类重视 结构化程序设计(英语:Structured programming),一种编程范型.它采用子程序(函数就是一种子程序).代码区块.for循环以及w ...

  6. Java程序设计基础项目总结报告

    Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现 ...

  7. Shell脚本 数据清洗

    需要做的任务是将上图类似的格式的文件进行处理,将年月日小时分别提取出来放到每行的行尾(上图已清洗好) 自己的思路是先用cut命令将每行的年月日小时提取出来,分别给一个变量,然后再循环利用sed命令将年 ...

  8. Java script 的dom编程

    实例1: </head> <body> <div id="div1"> <p id="p1">这是一个段落< ...

  9. Web应用程序的基本安全实践

    创建安全Web应用程序的主题非常广泛.它需要研究以了解安全漏洞.您还需要熟悉Windows..NET框架和ASP.NET的安全设施.最后,有必要了解如何使用这些安全特性来对付威胁. 即使您没有安全方面 ...

  10. opencv的安装和卸载

    安装 测试环境为centos 安装依赖 yum install cmake gcc gcc-c++ gtk2-devel gimp-develgimp-devel-tools gimp-help-br ...