基础不太熟的同学可以先去看: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. P2024 [NOI2001]食物链 并查集

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  2. Cyclic Nacklace hdu3746 kmp 最小循环节

    题意:给出一段字符串  求最少在最右边补上多少个字符使得形成循环串(单个字符不是循环串) 自己乱搞居然搞出来了... 想法是:  如果nex[len]为0  那么答案显然是补len 否则  答案为循环 ...

  3. sql语句表示不等于

    <> != 后面均不带引号“”

  4. 基于TensorFlow的MNIST数据集的实验

    一.MNIST实验内容 MNIST的实验比较简单,可以直接通过下面的程序加上程序上的部分注释就能很好的理解了,后面在完善具体的相关的数学理论知识,先记录在这里: 代码如下所示: import tens ...

  5. 用Java进行大数处理(BigInteger)-hdu1042

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目描述: 代码实现: import java.util.Scanner; import jav ...

  6. SVM:利用SVM算法实现手写图片识别(数据集50000张图片)—Jason niu

    import mnist_loader # Third-party libraries from sklearn import svm def svm_baseline(): training_dat ...

  7. Python虚拟环境的安装和配置-virtualenv与windows下多个python版本共存

    Python虚拟环境的安装和配置-virtualenv与windows下多个python版本共存 windows下多个python版本共存 https://www.python.org/downloa ...

  8. 笔记-JS高级程序设计-变量,作用域和内存问题

    1在将一个值赋给变量时,解析器必须确认这个值是基本类值还是引用类型值,基本类型值是按值访问的,可以操作保存在在变量中的实际值,引用类型是保 存在内存中的对象,JS不允许直接访问内存中的位置,所以实际操 ...

  9. 002.MySQL高可用主从复制部署

    一 基础环境 主机名 系统版本 MySQL版本 主机IP master CentOS 6.8 MySQL 5.6 172.24.8.10 slave01 CentOS 6.8 MySQL 5.6 17 ...

  10. spring_AOP_XML

    例子下载 对于xml的AOP配置主要集中在配置文件中,所以只要设置好配置文件就行了 beans.xml <?xml version="1.0" encoding=" ...