我们在前一篇文章中实现了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. Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述

    Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这 ...

  2. 笔试题——C++后序字符比较

    题目:从两个数组的最后一个元素开始比较,输出数组中不同元素的个数.当一个数组的所有元素比较完成后,结束比较.a数组长度5,b数组长度3,a[ 4 ]和b[ 2 ]比较. 例: 输入: 77 21 1 ...

  3. eject命令详解

    基础命令学习目录首页 原文链接:http://www.kgc.cn/bbs/post/128680.shtml Linux eject命令用于退出抽取式设备. 若设备已挂入,则eject会先将该设备卸 ...

  4. oracle删除死锁进程

    在命令行下运行: select SID,SERIAL# from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID; alte ...

  5. 一个demo 理解 vuex

    相比接触vue的同学们已经看了官方文档了.这里我用一个简单的demo来阐述下vuex的知识点,虽然简单,但是容易理解.也加深自己的记忆. 用脚手架建立个项目vue init webpakc-simpl ...

  6. 2-Nineth Scrum Meeting20151209

    任务分配 闫昊: 今日完成:商讨如何迁移ios代码到android平台. 明日任务:请假.(编译) 唐彬: 今日完成:商讨如何迁移ios代码到android平台. 明日任务:请假.(编译) 史烨轩: ...

  7. 新的Calculator的规范作业

    附加作业题目 第三次作业 mygithub:sonnypp 这是开学来第一次写随笔,这一次的作业是对上一次作业的修改,对于上一次作业,在学长老师的帮助下,我重新修改了下代码,将.h文件分成了一个Sca ...

  8. JVM的GC策略

    1 前言 GC(Garbage Collect)是jvm对于内存管理的核心功能,正是因为它才让Java程序员从内存释放的苦海中脱离出来,所以作为一个程序员都有必要去了解一下他的原理. 说一句题外话,我 ...

  9. iOS 判断当前app版本,升级

    要获取当前app store上的最新的版本,有两种方法, 一.在某特定的服务器上,发布和存储app最新的版本信息,需要的时候向该服务器请求查询. 二.从app store上查询,可以获取到app的作者 ...

  10. C++操作mysql方法总结(2)

    C++通过ODBC和通过MFC ODBC操作mysql的两种方式 使用vs2013和64位的msql 5.6.16进行操作 项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍 ...