修改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(记得修改并确保类名与文件名一致)

    修改代码至如下  

 1 package org.jasig.cas.adaptors.jdbc;
 2
 3 import java.security.GeneralSecurityException;
 4
 5 import org.jasig.cas.authentication.HandlerResult;
 6 import org.jasig.cas.authentication.PreventedException;
 7 import org.jasig.cas.authentication.UsernamePasswordCredential;
 8 import org.jasig.cas.authentication.principal.SimplePrincipal;
 9 import org.springframework.dao.DataAccessException;
10 import org.springframework.dao.IncorrectResultSizeDataAccessException;
11
12 import javax.security.auth.login.AccountNotFoundException;
13 import javax.security.auth.login.FailedLoginException;
14 import javax.validation.constraints.NotNull;
15
16 /**
17  * Class that if provided a query that returns a password (parameter of query
18  * must be username) will compare that password to a translated version of the
19  * password provided by the user. If they match, then authentication succeeds.
20  * Default password translator is plaintext translator.
21  *
22  * @author Scott Battaglia
23  * @author Dmitriy Kopylenko
24  * @author Marvin S. Addison
25  *
26  * @since 3.0
27  */
28 public class TyQueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {
29
30     @NotNull
31     private String sql;
32
33     private boolean useDefaultPassword;
34
35     private String defaultPassword;
36
37     /** {@inheritDoc} */
38     @Override
39     protected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)
40             throws GeneralSecurityException, PreventedException {
41
42         final String username = credential.getUsername();
43         final String password = useDefaultPassword ? defaultPassword : credential.getPassword();
44         final String encryptedPassword = this.getPasswordEncoder().encode(password);
45         try {
46             final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
47             if (!dbPassword.equals(encryptedPassword)) {
48                 throw new FailedLoginException("Password does not match value on record.");
49             }
50         } catch (final IncorrectResultSizeDataAccessException e) {
51             if (e.getActualSize() == 0) {
52                 throw new AccountNotFoundException(username + " not found with SQL query");
53             } else {
54                 throw new FailedLoginException("Multiple records found for " + username);
55             }
56         } catch (final DataAccessException e) {
57             throw new PreventedException("SQL exception while executing query for " + username, e);
58         }
59         return createHandlerResult(credential, new SimplePrincipal(username), null);
60     }
61
62     /**
63      * @param sql The sql to set.
64      */
65     public void setSql(final String sql) {
66         this.sql = sql;
67     }
68
69      /**
70      * @param isUseDefaultPassword The useDefaultPassword to set.
71      */
72     public void setUseDefaultPassword(final boolean isUseDefaultPassword) {
73         this.useDefaultPassword = isUseDefaultPassword;
74     }
75
76      /**
77      * @param defaultPassword The defaultPassword to set.
78      */
79     public void setDefaultPassword(final String defaultPassword) {
80         this.defaultPassword = defaultPassword;
81     }
82
83 }

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

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

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

1   <bean id="dbAuthenticationHandler"
2     class="org.jasig.cas.adaptors.jdbc.TyQueryDatabaseAuthenticationHandler">
3       <property name="dataSource" ref="dataSource"></property>
4       <property name="sql" value="select EmpPass as password from SsoAccount where EmpCode=? "></property>
5       <property name="passwordEncoder" ref="passwordEncoder"></property>
6       <property name="useDefaultPassword" value="true"></property>
7       <property name="defaultPassword" value="111111"></property>
8   </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访问你的网站飞起来可以看看效果了。

时间: 2025-01-16 08:09:26

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

(六)SSO之CAS框架扩展 修改CAS源码实现与ESS动态密码验证对接

题记: 偶尔的偶尔我们会听到这个网站的数据泄露了,那个网站的用户数据泄露了,让用户重新修改登录密码,所以,对于用户数据安全性越发的引起我们的重视了,尤其是一些保密性要求高的网站,更需要增加安全性了. 正文: 对于安全性问题,我们如何解决呢? 解决方案: 1.避免sql注入问题. 2.用户登录密码加密. 3.使用https安全访问方式. 4.使用第三方设备,像银行一般使用的密码口令. 5.... 前三种方案是比较常见的,这里主要说第四种解决方案,我们在前三种方案的基础上,使用了第三方的设备,就像网

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

AtomicInteger源码分析--基于CAS的乐观锁实现 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换.切换涉及到清空寄存器,缓存数据.然后重新加载新的thread所需数据.当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify(),notifyAll()唤醒回来.在某个资源不可用的时候,就将cpu让出,把当前等待线程切换为阻

Android源码开发利器——Java源码调试(基于4.1.2)

原文地址:http://blog.csdn.net/jinzhuojun/article/details/8868038 调试Android Java源码 草帽的后花园--Neo 写在之前的话:这里主要是以调试Java源码为主,应该说是在system_process之后的源码,这对于调试和修改frameworks层的人来说真是一个利器,但至于为什么在system_process之后,我还在分析,如果有结果我会更新此文章,并正在尝试调试C++的代码,就是native中的代码,如果这个可行那将会大大

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法 1.spreadOutApp尽量平均分配到每个executor上: 2.非spreadOutApp尽量在使用单个executor的资源. 源码分析 org.apache.spark.deploy.master.Master 1.首先判断,master状态不是ALIVE的话,直接返回2.调度driver3. Application的调度机制(核心之核心,重中之重) 源码如下: 1 /*

修改extjs源码关闭按钮样式

首先通过文件引用找到extjs的样式文件: <link rel="stylesheet" type="text/css" href="<%=basePath%>/publicresource/extlib/resources/css/ext-all.css" /> 打开ext-all.css在文件最后添加下面代码 .x-tool-close {          background-position:-2 -380px;

springmvc源码浅析(基于spring3.1.0)

请求处理过程:通过url找到对应Controller类中处理请求的方法,执行方法返回结果视图的过程.大致分为三个步骤: 其一,ApplicationContext初始化时建立所有url和controller类的对应关系(用Map保存); 其二,根据请求url找到对应的controller,并从controller中找到处理请求的方法; 其三,执行方法处理请求,并返回结果视图. 我们首先看第一个步骤,也就是建立Map<url,controller>关系的部分.第一部分的入口类为Applicati

【源码】基于Android和蓝牙的单片机温度采集系统

如需转载请标明出处:http://blog.csdn.net/itas109 STC89C52单片机通过HC-06蓝牙模块与Android手机通信实例- 基于Android和蓝牙的单片机温度采集系统 整个工程下载:http://download.csdn.net/detail/itas109/7539057 其中包括, 1.下位机电路原理图 2.下位机采集温度.控制发送.自动纠错代码 3.Android端接收温度并显示代码 文件截图 这个是我当年毕业设计做的东西,虽然比较简单,但是还是有一定的参

openwrt路由器更换了Flash之后需要修改的源码

假如我使用的是WR703N,改为8M内存: 1 修改openwrt/target/linux/ar71xx/image/Makefile文件 $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLMR3420V2,tl-mr3420-v2,TL-MR3420-v2,ttyS0,115200,0x34200002,1,4Mlzma)) #$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR703,tl-w

CAS源码追踪系列二:AuthenticationFilter对于请求的处理

上一篇我们说了在web项目中了和spring整合之后,如何进行对应Filter的初始化,如果你还没看过,请点击 <CAS源码追踪系列一:Filter的初始化>. 本篇我们来看看在初始化完成以后,cas-client是如何处理请求的. 源码地址:https://github.com/apereo/java-cas-client 如何你还不太清楚sso的原理,你可以看看这篇文章<单点登录原理与简单实现>. 当访问系统受保护的资源时,cas的过滤器AuthenticationFilter