基础不太熟的同学可以先去看:CAS 单点登录【1】入门

方案1:CAS默认的JDBC扩展方案:

CAS自带了两种简单的通过JDBC方式验证用户的处理器。

1.QueryDatabaseAuthenticationHandler

2.SearchModeSearchDatabaseAuthenticationHandler

这两个处理类位于cas-server-support-jdbc这个扩展工程下。

第一步:改写用户验证处理器

deployerConfigContext.xml

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

把他替换成为 下面两种其中任意一个bean皆可。

<bean id="SearchModeSearchDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
<property name="tableUsers">
<value>users</value>
</property>
<property name="fieldUser">
<value>user_id</value>
</property>
<property name="fieldPassword">
<value>password</value>
</property>
<property name="dataSource" ref="dataSource" />
</bean>

或者

 <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select password from some_table where lower(username) = lower(?)" />
</bean>

把对应的用户表名、用户名、密码替换成为 你实际数据库中的 用户表名、用户名、密码对应的字段名称。

第二步:加载驱动(oracle、mysql任选一种),连接数据库

依然在这个文件中deployerConfigContext.xml,在最后一个</bean>标签之前,加上下面配置即可(oracle、mysql任选其一)。

   <!-- Oracle connector -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@database-server-name:1521:SID</value>
</property>
<property name="username">
<value>admusr</value>
</property>
<property name="password">
<value>admpwd</value>
</property>
</bean> <!-- MySQL connector -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://database-server-name:3306/db-name</value>
</property>
<property name="username">
<value>admusr</value>
</property>
<property name="password">
<value>admpwd</value>
</property>
</bean>

第三步:导入必要的jar包

cas-server-webapp的pom.xml

<!-- 必须导入start -->
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.1</version>
<scope>runtime</scope>
</dependency>
<!-- 必须导入end --> <!-- oracle 、 mysql 任选其一 start-->
<dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.5</version>
<scope>provided</scope>
</dependency>
<!-- oracle 、 mysql 任选其一 end-->

重新启动项目,在登录页验证即可。

方案2:套用原有项目的用户登录逻辑(非JDBC方式

背景:

1.因为是要整合多个项目的登录功能,换句话说,就是原有的项目其实分别都有已经实现的用户登录逻辑页面、登录逻辑,并且是经过了大量测试,程序逻辑比较健壮。

2.原有的项目并不是通过JDBC方式来访问数据库的,为了保持代码风格统一,最好与其他项目保持一致,或者直接套用原有的验证逻辑。(比如:我们项目使用的是Mybatis方式)

3.CAS扩展的JDBC验证方式还是过于简单,对于复杂的验证逻辑不便于扩展。

第一步:自定义一个用户验证处理器

可以在原有的cas-server-support-jdbc工程下,也可以自己新建一个工程

注意:本类要继承这个类AbstractUsernamePasswordAuthenticationHandler

public final class MyUserAuthenticationHandler extends
AbstractUsernamePasswordAuthenticationHandler
{
/**
* 这个API是原有项目验证用户相关处理的API,直接导入相关jar包就可以使用
*/
@Autowired
private UserApi userApi; @Override
protected final boolean authenticateUsernamePasswordInternal(
final UsernamePasswordCredentials credentials)
throws MyAuthenticationException
{
String username = getPrincipalNameTransformer().transform(credentials.getUsername());
String password = credentials.getPassword();
try
{
userApi.login(username, password);
}
catch (Exception e)
{
throw new MyAuthenticationException(e);
}
return true;
}
}

第二步:自定义异常处理器

因为CAS原有的异常处理逻辑是,只能通过errorcode去messages_zh_CN.properties寻找已经中定义好的异常消息,

如果找不到直接返回errorcode到页面,并不支持直接抛出文字形式的异常消息。还需要为每种异常都定义专属的异常类,例如:

BadCredentialsAuthenticationException.java

BadPasswordAuthenticationException.java

BadUsernameOrPasswordAuthenticationException.java

而本异常类可以直接接受Api抛出的所有异常,或者也可以自定义文字形式的异常消息。如:new Exception("这是异常消息")

同样也支持原有的根据errorCode读取异常消息的方式。

public final class MyAuthenticationException extends
AuthenticationException
{ /** Serializable ID. */
private static final long serialVersionUID = 3906648604830611762L; /**
* 本构造方法可以返回任何自定义的异常消息到前台
* <p>例子:TongXiangAuthenticationException(new Exception("自定义的异常消息"))</p>
*/
public MyAuthenticationException(final Throwable throwable)
{
super(throwable.getMessage());
} /**
* 本构造方法只能返回在messages_zh_CN.properties中已经定义好的异常消息
*/
public MyAuthenticationException(final String code)
{
super(code);
}

第三步:修改deployerConfigContext.xml

方案1中,在配置文件中配置了

JDBC方式的处理器bean、连接数据库的BasicDataSource bean 这里统统不需要。

直接找到这个处理器

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

把他替换成为自定义的验证处理器。

<bean class="org.jasig.cas.authentication.handler.support.MyUserAuthenticationHandler" />

因为,访问数据库以及验证用户逻辑的处理都在UserApi中做处理,不需要CAS再做处理了。

第四步:pom.xml加载自定义的工程或者被修改的工程jar包

cas-server-webapp的pom.xml

<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${project.version}</version>
</dependency>

或者用户自定义的项目

<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-myself</artifactId>
<version>1.0</version>
</dependency>

CAS 单点登录【2】自定义用户验证的更多相关文章

  1. CAS单点登录之mysql数据库用户验证及常见问题

    前面已经介绍了CAS服务器的搭建,详情见:搭建CAS单点登录服务器.然而前面只是简单地介绍了服务器的搭建,其验证方式是原始的配置文件的方式,这显然不能满足日常的需求.下面介绍下通过mysql数据库认证 ...

  2. cas 单点登录 --自定义审计日记@Audit()

    错误信息: org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [An ...

  3. SSO之CAS单点登录详细搭建教程

    本教程是我个人编写,花费几个小时的时间,给需要学习的人员学习使用,希望能帮助到你们. [环境说明]:本文演示过程在同一个机器上的(也可以在三台实体机器或者三个的虚拟机上),环境如下: windows7 ...

  4. SSO单点登录系列5:cas单点登录增加验证码功能完整步骤

    本篇教程cas-server端下载地址:解压后,直接放到tomcat的webapp目录下就能用了,不过你需要登录的话,要修改数据源,C:\tomcat7\webapps\casServer\WEB-I ...

  5. Spring boot security权限管理集成cas单点登录

    挣扎了两周,Spring security的cas终于搞出来了,废话不多说,开篇! Spring boot集成Spring security本篇是使用spring security集成cas,因此,先 ...

  6. CAS单点登录系列之极速入门于实战教程(4.2.7)

    @ 目录 一. SSO简介 1.1 单点登录定义 1.2 单点登录角色 1.3 单点登录分类 二. CAS简介 2.1 CAS简单定义 2.2 CAS体系结构 2.3 CAS原理 三.CAS服务端搭建 ...

  7. SSO之CAS单点登录实例演示

    本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...

  8. cas系列(一)--cas单点登录基本原理

    (这段时间打算做单点登录,因此研究了一些cas资料并作为一个系列记录下来,一来可能会帮助一些人,二来对我自己所学知识也是一个巩固.) 一.为什么要实现单点登录 随着信息化不断发展,企业的信息化过程是一 ...

  9. CAS单点登录(SSO)完整教程

    转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的 ...

随机推荐

  1. 054 kafka内部机制

    一:数据格式与数据存储 1.总结 存储在磁盘文件中(index+log) 顺序读写的 基于offset偏移量来管理数据的(主要是读操作) 由分区器根据key值决定数据分布到哪个分区,默认使用hash ...

  2. count()函数在count()中参数的讨论

    http://www.cnblogs.com/CareySon/p/DifferenceBetweenCountStarAndCount1.html

  3. Python编程基础(一)

    1.Python中的变量赋值不需要类型声明 2.等号(=)用来给变量赋值 3.字符串拼接用  “+”  号 temp=‘123’ print('temp的值是%s'%temp) #整数和字符创的转换, ...

  4. Python isinstance 方法 判断 built-in types(内置类型)技巧

    Python isinstance 方法 判断 built-in types(内置类型)技巧 d = {} isinstance(d, type({})) isinstance(d, dict) l ...

  5. 20165220 2017-2018-2《Java程序设计》课程总结

    每周作业链接汇总: 20165220 我期望的师生关系 20165220 学习基础和C语言基础调查 20165220 Linux安装及学习 20165220 第一周学习总结 20165220 第二周学 ...

  6. unity3d俄罗斯方块源码教程+源码和程序下载

    小时候,大家都应玩过或听说过<俄罗斯方块>,它是红白机,掌机等一些电子设备中最常见的一款游戏.而随着时代的发展,信息的进步,游戏画面从简单的黑白方块到彩色方块,游戏的玩法机制从最简单的消方 ...

  7. 超出JavaScript安全整数限制的数字计算-BigInt

    JavaScript中的基本数据类Number是双精度浮点数,它可以表示的最大安全范围是正负9007199254740991,也就是2的53次方减一,在浏览器控制台分别输入Number.MAX_SAF ...

  8. 【SQL】SQL整表复制

    SQL Server中,如果目标表存在: 1 insert into 目标表 select * from 原表; SQL Server中,如果目标表不存在: 1 select * into 目标表 f ...

  9. 踩坑记:Tensorflow环境搭建

    自从上一篇论文投出去,之后就各种事就来了……处理那些乱七八糟的事就是让人心累,在加上师哥们毕业,能帮我的人越来越少了,而要指望你的人呢,越来越多.一想到那些用搜索引擎都搜不到资料的人,蓦地想起邓爷爷说 ...

  10. [R] R dataframe 中对列使用sort或者order的注意

    存在这样的需求: 针对每列的值, 对列进行排序. 这样处理过数据后, 在excel中对数据作图时, 使数据呈现有序. R中sort数据的时候, 如果数据中存在字符串, R会将数据转化为characte ...