• 第一部分:安装配置 Tomcat
  • 第二部分:安装配置 CAS
  • 第三部分:实现 ASP.NET WebForm Client
  • 第四部分:实现基于数据库的身份验证

第五部分:扩展基于数据库的身份验证

1. 应用场景

前面提到的基于数据库的集中身份验证主要是通过用户名、密码的方式完成验证操作,然而在实际使用过程中,用户可能需要多种形式的认证手段,除了用户名密码的方式外,还可能通过邮箱或手机号登录,但不管使用何种方式登录,都对应同一用户。下图演示了淘宝网在登录时允许用户以“手机号/会员名/邮箱”三种方式登录系统。

2. 数据库设计

针对上述需求,重新设计数据库字段,如下图所示:

输入测试用数据,如下图所示:

3. 自定义数据库验证Handler

关于自定义数据库验证Handler的文章比较多,我主要参考了《CAS扩展——自定义查询数据库验证Handler》和《CAS重新实现登陆认证逻辑》。但是这两篇文章介绍的相对较糙,对于不了解Java的人来说实施起来着实有点困难,所以在这里我将两人的东西综合一下并给出详尽的操作流程供参考。

说明:大家可以从解压缩的“cas-server-3.5.1\cas-server-support-jdbc\src”文件夹下找到“QueryDatabaseAuthenticationHandler.java”的源代码以及其它相关源码供参考。

(1)安装Eclipse。Eclipse是非常常用的一种Java编辑器。为了完成组件编写,我们首先需要安装Eclipse。Eclipse的下载与安装非常简单,在这里就不再赘述。

(2)启动Eclipse,选择“File/New/Java Project”,打开新建项目对话框,在“Project Name”文本框中输入“MultiCriteriaQueryDatabaseAuthenticationHandler”,单击“Finish”按钮。如下图所示:

(3)在“Package Explorer”中右击项目“MultiCriteriaQueryDatabaseAuthenticationHandler”,选择“New/Folder”,在弹出的对话框中输入“lib”并单击“Finishe”按钮。

(4)从解压缩的“cas-server-3.5.1\modules”文件夹中找到“cas-server-core-3.5.1.jar”与“cas-server-support-jdbc-3.5.1.jar”两个文件,将其拷贝到新建的“lib”文件夹下。

(5)从网上搜索并下载“spring.jar”与“javax.validation-1.0.0.GA.jar”两个文件,也将其拷贝到新建的“lib”文件夹。刷新后的项目如下图所示:

(6)在“Package Explorer”中右击项目“MultiCriteriaQueryDatabaseAuthenticationHandler”,选择“Build Path/Add External Archives...”,依次将刚才拷贝到lib文件夹下的四个jar文件添加至项目的“Reference Libraries”中。完成后的界面如下图所示:

(7)在“src”文件夹上右击,选择“New/Class”,弹出新建Java类对话框。在Package文本框中输入“org.jasig.cas.adaptors.jdbc”,在Name文本框中输入“MultiCriteriaQueryDatabaseAuthenticationHandler”,单击“Finish”按钮。

(8)用下面的代码替换“MultiCriteriaQueryDatabaseAuthenticationHandler.java”文件中的现有代码,单击保存按钮保存修改。

package org.jasig.cas.adaptors.jdbc;

import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException; import javax.validation.constraints.NotNull; public class MultiCriteriaQueryDatabaseAuthenticationHandler extends
AbstractJdbcUsernamePasswordAuthenticationHandler { @NotNull
private String getPwdSql; @NotNull
private String getUsernameSql; protected final boolean authenticateUsernamePasswordInternal(
UsernamePasswordCredentials credentials)
throws AuthenticationException {
final String id = getPrincipalNameTransformer().transform(
credentials.getUsername());
final String password = credentials.getPassword();
final String encryptedPassword = this.getPasswordEncoder().encode(
password); try {
String dbPassword = getJdbcTemplate().queryForObject(
this.getPwdSql, String.class, new Object[] { id, id, id }); String username = getJdbcTemplate().queryForObject(
this.getUsernameSql, String.class,
new Object[] { id, id, id }); credentials.setUsername(username);
return dbPassword.equals(encryptedPassword);
} catch (final IncorrectResultSizeDataAccessException e) {
// this means the username was not found.
return false;
}
} public void setGetPwdSql(final String getPwdSql) {
this.getPwdSql = getPwdSql;
} public void setGetUsernameSql(final String getUsernameSql) {
this.getUsernameSql = getUsernameSql;
}
}

(9)在“Package Explorer”中右击项目“MultiCriteriaQueryDatabaseAuthenticationHandler”,选择“Export...”打开Export对话框。

(10)在“Export”对话框中选择“JAR file”,单击“Next”按钮。

(11)在JAR文件设置对话框中,去掉“lib”文件夹前面的对勾,同时去掉“.classpath”和“.project”前面的对勾,选择JAR文件的保存路径到桌面,单击“Finish”按钮。如下图所示:

(12)将桌面上生成的“MultiCriteriaQueryDatabaseAuthenticationHandler.jar”文件拷贝至“%TOMCAT_HOME%\webapps\cas\WEB-INF\lib”文件夹下。

(13)以管理员身份启动文本编辑器,打开“%TOMCAT_HOME%\webapps\cas\WEB-INF\deployerConfigContext.xml”。找到下面的代码(这段代码是上篇博文中我们添加进去的):

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="sql" value="select Password from users where username=?" />
<property name="dataSource" ref="dataSource" />
</bean>

(14)将上面这段代码注释掉,并在其下插入如下配置信息并保存:

<bean class="org.jasig.cas.adaptors.jdbc.MultiCriteriaQueryDatabaseAuthenticationHandler">
<property name="getPwdSql" value="select password from users where username=? or email=? or mobile=?" />
<property name="getUsernameSql" value="select username from users where username=? or email=? or mobile=?" />
<property name="dataSource" ref="dataSource" />
</bean>

(15)重新启动Tomcat服务。

4.测试自定义数据库身份验证Handler

从客户端运行前面调试好的WebForm程序(请参考:Yale CAS + .net Client 实现 SSO(3)),输入用户名“admin”或“admin@163.com”或“12345678901”、密码“123”,测试是否登录成功。可以看到,不管用户使用邮件还是手机号登录,客户端始终显示用户名,而非邮箱和手机号。这是因为在MultiCriteriaQueryDatabaseAuthenticationHandler.java代码中如下代码所决定的:

String username = getJdbcTemplate().queryForObject(
this.getUsernameSql, String.class,
new Object[] { id, id, id }); credentials.setUsername(username);

登录后的用户界面如下图所示:

(转)Yale CAS + .net Client 实现 SSO(5)的更多相关文章

  1. (转)Yale CAS + .net Client 实现 SSO(4)

    第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 1.下载 Microsoft JDBC ...

  2. (转)Yale CAS + .net Client 实现 SSO(2)

    第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 1. 下载 CAS 及.NET CAS client. CAS下载地址:http://www.jasig.org/cas/download ...

  3. (转)Yale CAS + .net Client 实现 SSO(6)

    第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 第四部分:实现基于数据库的身份验证 第五部分:扩展基于数据库的身份验证 第六 ...

  4. (转)Yale CAS + .net Client 实现 SSO(3)

    第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 第三部分:实现 ASP.NET WebForm Client 1. 下载.NET CAS client. .NET CAS Client ...

  5. (转)Yale CAS + .net Client 实现 SSO(1)

    由于信息系统集成需要,最近研究了一下CAS.从网上找了不少资料,很多是针对Java平台的,为数不多的针对.net Client的文章往往片面的介绍某个方面,照着去做确会遇到大量的问题,特别是“重定向循 ...

  6. Yale CAS + .net Client 实现 SSO 的完整版

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. CAS实现单点登录SSO执行原理及部署

    一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...

  8. CAS实现单点登录SSO执行原理探究超详细

    一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...

  9. CAS实战のclient自定义过滤器

    我们在配置cas client肯定写过如下代码: <filter> <filter-name>CASFilter</filter-name> <filter- ...

随机推荐

  1. !"false"==fasle

    首先要搞清楚优先级 !"false" --->false false == false;---->true !""--->true; !&qu ...

  2. iframe自适应高度的多种方法小结

    转自:http://www.jb51.net/article/15780.htm 不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 iframe的大小 ...

  3. iOS开发——动画编程Swift篇&(四)CABasicAnimation动画

    CABasicAnimation动画 //CABasicAnimation-不透明度 @IBAction func cabOpacity() { let animation = CABasicAnim ...

  4. 过滤文本文档中的数据并插入Cassandra数据库

    代码如下: package com.locationdataprocess; import java.io.BufferedReader; import java.io.File; import ja ...

  5. linux文件操作命令--转

    引用地址:http://bbsunchen.iteye.com/blog/1010993 想自己一开始处理文件的时候,看文件有多少行,都要写个perl脚本,好不麻烦啊...以此文纪念自己傻逼的科研生活 ...

  6. 基于linux2.6.38.8内核zImage文件的自解压详解

    转载:http://blog.csdn.net/wavemcu/article/details/7270439 ******************************************** ...

  7. SecureCRT 滚动条设置

    不久前在Debian下使用kermit时发现kermit有一些优点,比如当串口上不断有信息打印时,仍然可以通过拖动滚动条来查看以前打印的信息,并且滚动条不会滚动到最下面.当按下回车键时,滚动条会自动滚 ...

  8. c#实现无标题栏窗口的拖动

    当把窗体的FormBorderStyle属性设为None后会导致边框没了,结果窗体无法用鼠标拖动.最大.最下化和关闭…… 下面解决窗体可拖动问题:1.首先导入命名空间: using System.Ru ...

  9. C# mvc--ORM框架中EF的作用和特点

    存放于System.Linq.QueryAble 静态类中 并且所有的扩展方法扩展自 IqueryAble<TSource>泛型接口上 用途: 接收lambda表达式 利用EF生成对应的s ...

  10. 【Linux/Ubuntu学习 14】Linux下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...