修改CAS源码是的基于DB的认证方式配置更灵活
最近在做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的认证方式配置更灵活的更多相关文章
- 框架源码系列七:Spring源码学习之BeanDefinition源码学习(BeanDefinition、Annotation 方式配置的BeanDefinition的解析)
一.BeanDefinition 1. bean定义都定义了什么? 2.BeanDefinition的继承体系 父类: AttributeAccessor: 可以在xml的bean定义里面加上DTD ...
- Springboot security cas源码陶冶-ExceptionTranslationFilter
拦截关键的两个异常,对异常进行处理.主要应用异常则跳转至cas服务端登录页面 ExceptionTranslationFilter#doFilter-逻辑入口 具体操作逻辑如下 public void ...
- AtomicInteger源码分析——基于CAS的乐观锁实现
AtomicInteger源码分析——基于CAS的乐观锁实现 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时 ...
- 并发-AtomicInteger源码分析—基于CAS的乐观锁实现
AtomicInteger源码分析—基于CAS的乐观锁实现 参考: http://www.importnew.com/22078.html https://www.cnblogs.com/mantu/ ...
- 32.修改IK分词器源码来基于mysql热更新词库
主要知识点, 修改IK分词器源码来基于mysql热更新词库 一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...
- THINKPHP_(8)_修改TP源码,支持基于多层关联的任一字段进行排序
之前博文 前述博文THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序,其解决的主要问题是,对于查询出的think\collection数据,按指定字段对数据进行排序,从而在页面上进 ...
- 项目源码--JAVA基于LBS地理位置信息应用的服务端
技术要点: 1. LBS应用框架服务端实现 2. JAVA服务端技术 3. MYSQL数据库技术 4. 源码带详细的中文注释 ...... 详细介绍: 1. LBS应用框架服务端实现 此套源码是基 ...
- 实操重写IK分词器源码,基于mysql热更新词库
实操重写IK分词器源码,基于mysql热更新词库参考网址:https://blog.csdn.net/wuzhiwei549/article/details/80451302 问题一:按照这篇文章的介 ...
- 《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode
目录 问题 思路 kafka参数问题 支持batchmode的问题 参数提交至kafkasource的问题 group by支持问题 实现 编译 测试 因为在一篇博文上看到介绍"汽车之家介绍 ...
随机推荐
- Learning opencv续不足(七)线图像的设计D
因为线图像startline有了起点和终点,我们就可以用DDA法求出线上所有点,任意斜率直线通过四象限八区域查表法界定.我们只示范一个区域:函数为: public PointF DdaFindPtIm ...
- 运维是做什么的?史上最全互联网Linux工作规划!十分钟找到linux运维工程师职业方向!
首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...
- is_NaN的使用
原生js中使用判断某个值是否是数值,有且只有一个方法就是is_NaN. 原理:这个函数使用了Number() 去转换需要判断的值.Number() 去转换值,如果有任意非数值字符存在则就不是一个数值. ...
- LVM和RAID
RAID: Redundant Arrays of Inexpensive Disks Independent Berkeley: A case for Redundent Arrays of Ine ...
- PHP常用系统设置整理
1.设置时间脚本执行时间 set_time_limit(0); 2.设置最大执行内存 ini_set('memory_limit','1024M');//设置内存 memory_get_usage() ...
- 第五节:numpy之数组维度处理
- 编译Openwrt的log
Openwrt配置: Target System (Ralink RT288x/RT3xxx) ---> Subtarget (MT7688 based boards) ---> Targ ...
- hdu 5179 beautiful number
beautiful number 问题描述 令 A = \sum_{i=1}^{n}a_i * {10}^{n-i}(1\leq a_i \leq 9)A=∑i=1nai∗10n−i ...
- ZooKeeper学习总结(1)——ZooKeeper入门介绍
1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的核 ...
- 联赛前集训日记Day3
考试 竟然出了道莫比乌斯函数的应用?? 简直没法玩 刷题 莫比乌斯函数摆在面前,咋能很快改完啊 生活 GGGGGGGGGGG 自己浪过头了,开回家一周 这车翻得猝不及防,然而自己作的,自己受,只是给别 ...