最近在做CAS配置的时候,遇到了数据源不提供密码等数据的情况下,怎样实现密码输入认证呢?

  第一步:新建Java项目,根据假面算法生成CAS加密工具

  出于保密需要不提供自定义的加密工具,在您的实际项目中,你可采用cas默认的加密方式比如md5.

  第二步:修改CAS源码

    找到cas-server-support-jdbc子模块找到包路径cas-server-support-jdbc\src\main\java\org\jasig\cas\adaptors\jdbc\,在复制一份QueryDatabaseAuthenticationHandler.java并重新命名未TyQueryDatabaseAuthenticationHandler.java(记得修改并确保类名与文件名一致)

    修改代码至如下  

 package org.jasig.cas.adaptors.jdbc;

 import java.security.GeneralSecurityException;

 import org.jasig.cas.authentication.HandlerResult;
import org.jasig.cas.authentication.PreventedException;
import org.jasig.cas.authentication.UsernamePasswordCredential;
import org.jasig.cas.authentication.principal.SimplePrincipal;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException; import javax.security.auth.login.AccountNotFoundException;
import javax.security.auth.login.FailedLoginException;
import javax.validation.constraints.NotNull; /**
* Class that if provided a query that returns a password (parameter of query
* must be username) will compare that password to a translated version of the
* password provided by the user. If they match, then authentication succeeds.
* Default password translator is plaintext translator.
*
* @author Scott Battaglia
* @author Dmitriy Kopylenko
* @author Marvin S. Addison
*
* @since 3.0
*/
public class TyQueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler { @NotNull
private String sql; private boolean useDefaultPassword; private String defaultPassword; /** {@inheritDoc} */
@Override
protected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)
throws GeneralSecurityException, PreventedException { final String username = credential.getUsername();
final String password = useDefaultPassword ? defaultPassword : credential.getPassword();
final String encryptedPassword = this.getPasswordEncoder().encode(password);
try {
final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
if (!dbPassword.equals(encryptedPassword)) {
throw new FailedLoginException("Password does not match value on record.");
}
} catch (final IncorrectResultSizeDataAccessException e) {
if (e.getActualSize() == 0) {
throw new AccountNotFoundException(username + " not found with SQL query");
} else {
throw new FailedLoginException("Multiple records found for " + username);
}
} catch (final DataAccessException e) {
throw new PreventedException("SQL exception while executing query for " + username, e);
}
return createHandlerResult(credential, new SimplePrincipal(username), null);
} /**
* @param sql The sql to set.
*/
public void setSql(final String sql) {
this.sql = sql;
} /**
* @param isUseDefaultPassword The useDefaultPassword to set.
*/
public void setUseDefaultPassword(final boolean isUseDefaultPassword) {
this.useDefaultPassword = isUseDefaultPassword;
} /**
* @param defaultPassword The defaultPassword to set.
*/
public void setDefaultPassword(final String defaultPassword) {
this.defaultPassword = defaultPassword;
} }

  第三步:修改你的CAS部署包代码

  解压你的部署包,找到文件deployerConfigContext.xml

  如果你的代码修改代码如下:  

   <bean id="dbAuthenticationHandler"
class="org.jasig.cas.adaptors.jdbc.TyQueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource"></property>
<property name="sql" value="select EmpPass as password from SsoAccount where EmpCode=? "></property>
<property name="passwordEncoder" ref="passwordEncoder"></property>
<property name="useDefaultPassword" value="true"></property>
<property name="defaultPassword" value="111111"></property>
</bean>

  id=dbAuthenticationHandle的bean表示登录账号以及密码的认证方式处理配置,该配置被id=authenticationManager的bean配置所引用

  配置代码dbAuthenticationHandler中的TyQueryDatabaseAuthenticationHandler是上述自定义实现的代码,新增2属性,userDefaultPassword=true表示服务端验证登录页面提交的密码的时候,t提交的密码不作为实际的密码来源,而是从属性defaultPassword中取值,反之userDefaultPassword=false表示登录页面提交的密码作为服务端认证密码的密码来源。此处的11111模拟的是登录密码输入的密码,因此它是明文的,实际上用户是看不到这个密码的,而数据库里面存的不是111111而是111111经过加密后的密文,在内部进行111111进行验证的时候是需要对111111进行加密的。具体的加密过程是根据您的配置来实现的,本处则以上述第二步提到的方式为参考,实际上加密这块你可自行定制.

  datasSoure的配置本文不予列出

  第四步:编译cas-server-support-jdbc

  由于cas本文所采用的版本是基于mvn开发的,实际版本号是4.0.0,因此需要通过mvn口令来编译,实际操作如下:

  打开cas-server-support-jdbc源码所在文件夹,快捷组合ctrl+shift+鼠标右键(如果你左右键是反的请切换为鼠标右键)打开控制台,输入命令 mvn clean compile回车进行编译

  打开便后的目录cas-server-support-jdbc\target\classes\org\jasig\cas\adaptors\jdbc\,在此处你会找到TyQueryDatabaseAuthenticationHandler.class二进制文件

  第五步:打包jar文件

  打开cas-server-support-jdbc\target\classes\,快捷组合ctrl+shift+鼠标右键打开控制台,输入口令jar -cvf cas-server-support-jdbc-4.0.0.jar org回车就生成了jar包文件

  包文件名称解释:“cas-server-support-jdbc”表示mvn项目自模块名“-4.0.0”表示你的mvn主项目的版本号,mvn的子模块的版本号应与mvn主项目版本号保持一致

  

  第六步:部署

  复制上述编译出来的cas-server-support-jdbc-4.0.0.jar文件至您的cas部署包下面的lib目录下面,再按照上述第三步修改配置文件.Ok此时修改打包并部署完成。此时重启tomact访问你的网站飞起来可以看看效果了。

修改CAS源码是的基于DB的认证方式配置更灵活的更多相关文章

  1. 框架源码系列七:Spring源码学习之BeanDefinition源码学习(BeanDefinition、Annotation 方式配置的BeanDefinition的解析)

    一.BeanDefinition 1. bean定义都定义了什么? 2.BeanDefinition的继承体系  父类: AttributeAccessor: 可以在xml的bean定义里面加上DTD ...

  2. Springboot security cas源码陶冶-ExceptionTranslationFilter

    拦截关键的两个异常,对异常进行处理.主要应用异常则跳转至cas服务端登录页面 ExceptionTranslationFilter#doFilter-逻辑入口 具体操作逻辑如下 public void ...

  3. AtomicInteger源码分析——基于CAS的乐观锁实现

    AtomicInteger源码分析——基于CAS的乐观锁实现 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时 ...

  4. 并发-AtomicInteger源码分析—基于CAS的乐观锁实现

    AtomicInteger源码分析—基于CAS的乐观锁实现 参考: http://www.importnew.com/22078.html https://www.cnblogs.com/mantu/ ...

  5. 32.修改IK分词器源码来基于mysql热更新词库

    主要知识点, 修改IK分词器源码来基于mysql热更新词库     一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...

  6. THINKPHP_(8)_修改TP源码,支持基于多层关联的任一字段进行排序

    之前博文 前述博文THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序,其解决的主要问题是,对于查询出的think\collection数据,按指定字段对数据进行排序,从而在页面上进 ...

  7. 项目源码--JAVA基于LBS地理位置信息应用的服务端

    技术要点: 1. LBS应用框架服务端实现 2. JAVA服务端技术 3. MYSQL数据库技术 4. 源码带详细的中文注释 ......   详细介绍: 1. LBS应用框架服务端实现 此套源码是基 ...

  8. 实操重写IK分词器源码,基于mysql热更新词库

    实操重写IK分词器源码,基于mysql热更新词库参考网址:https://blog.csdn.net/wuzhiwei549/article/details/80451302 问题一:按照这篇文章的介 ...

  9. 《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode

    目录 问题 思路 kafka参数问题 支持batchmode的问题 参数提交至kafkasource的问题 group by支持问题 实现 编译 测试 因为在一篇博文上看到介绍"汽车之家介绍 ...

随机推荐

  1. Python 之pygame飞机游戏

    import pygame from pygame.locals import * import time import random # 我机 class HeroPlane(object): de ...

  2. asp网站中使用百度ueditor教程.txt

    1.根据网站类型及编码选择相应的ueditor版本,如我的网站编码为gb2312,则选择ueditor 1.43 asp gbk版.2.本机IE浏览器应为8.0或以上,8.0以下的ueditor 1. ...

  3. [SQL Service]从一张表取值更新另一张表字段

    1. update table_A set  table_A_column = ab.column from table_A aa left join table_B ab on aa.xx = ab ...

  4. [LUOGU] 1108 低价购买

    统计本质不同的\(LIS\)个数. 因为本题要求的是\(N^2\)级别的算法,就直接暴力统计\(LIS\)的个数了 然后统计方案数的话加入发现有之间有一个值,以它为结尾的\(LIS\)长度和当前的相等 ...

  5. collections、random、hashlib、configparser、logging模块

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  6. python爬虫11 | 这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们

    在上一篇中 python爬虫10 | 网站维护人员:真的求求你们了,不要再来爬取了!! 小帅b给大家透露了我们这篇要说的牛逼利器 selenium + phantomjs 如果你看了 python爬虫 ...

  7. flask中的session cookie 测试 和 项目中的用户状态保持

    # -*- coding:utf-8 -*- # Author: json_steve from flask import Flask, current_app, make_response, req ...

  8. 【[Offer收割]编程练习赛13 A】风格不统一如何写程序

    [题目链接]:http://hihocoder.com/problemset/problem/1501 [题意] [题解] 模拟题 [Number Of WA] 1 [完整代码] #include & ...

  9. ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听

    对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了.那么,Spring提供了一个很方便的去收发消息的框架,spring jms.整合 ...

  10. Maven学习总结(1)——Maven入门

    Maven学习总结(一)--Maven入门 一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的 ...