单点登录CAS使用记(三):实现自定义验证用户登录
问题:
CAS自带的用户验证逻辑太过简单,如何像正常网站一样,通过验证DB中的用户数据,来验证用户以及密码的合法性呢?
方案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使用记系列:
单点登录CAS使用记(一):前期准备以及为CAS-Server配置SSL协议
单点登录CAS使用记(二):部署CAS服务器以及客户端
单点登录CAS使用记(三):实现自定义验证用户登录
单点登录CAS使用记(四):为登录页面加上验证码
单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。
单点登录CAS使用记(六):单点登出、单点注销
单点登录CAS使用记(七):关于服务器超时以及客户端超时的分析
单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS
单点登录CAS使用记(三):实现自定义验证用户登录的更多相关文章
- 单点登录CAS使用记(四):为登录页面加上验证码
CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...
- 单点登录CAS使用记(一):前期准备以及为CAS-Server配置SSL协议
知识点: SSO:单点登录(Single Sign On),是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS:耶 ...
- 单点登录CAS使用记(二):部署CAS服务器以及客户端
CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...
- 单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。
一.问题在哪? 在配置cas-client中,有这么一段配置: <filter> <filter-name>CAS Filter</filter-name> < ...
- 单点登录CAS使用记(六):单点登出、单点注销
单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...
- 单点登录CAS使用记(七):关于服务器超时以及客户端超时的分析
我的预想情况 一般情况下,当用户登录一个站点后,如果长时间没有发生任何动作,当用户再次点击时,会被强制登出并且跳转到登录页面, 提醒用户重新登录.现在我已经为站点整合了CAS,并且已经实现了单点登录以 ...
- 单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS
前期在学习CAS部署的过程中,都是网上各种教程,各种方案不停的尝试. 期间各种侵入改源码,时间久了,改了哪个文件,改了哪段配置,增加了哪段代码,都有可能混淆不清了. 而且最大的问题是,万一换个人来维护 ...
- How to use the windows active directory to authenticate user via logon form 如何自定义权限系统,使用 active directory验证用户登录
https://www.devexpress.com/Support/Center/Question/Details/Q345615/how-to-use-the-windows-active-dir ...
- Asp.Net使用加密cookie代替session验证用户登录状态 源码分享
首先 session 和 cache 拥有各自的优势而存在. 他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段 本实例采用vs2010编写 ...
随机推荐
- jdbc(1)(一)
1.连接数据库,准备mysql连接jar包导入项目: Class.forName("com.mysql.jdbc.Driver"); //建立连接是比较耗时,耗资源的,实际开发中多 ...
- Chapter 2. OpenSSL的安装和配置学习笔记
Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...
- C语言学习笔记--结构体
结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...
- java签名证书
import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; impo ...
- 【HDOJ】4986 Little Pony and Alohomora Part I
递推.设n个盒子的Spell次数为S(n),期望为E(n).当有n个盒子时,可能第n把钥匙在第n个盒子中,此时的Spell次数应该为(n-1)!+S(n-1):当第n把钥匙不在第n个盒子中,混合排列, ...
- GCC依赖库顺序问题
今天在把linux下做的ipmsg移植到windows过程中,因为包含了一个开源库SimpleSocket,而这个库又引用了winsock2,没太注意就写下了下面的makefile: g++ -o t ...
- convex optimization
##凸优化总结所有这些想法基本是来自于书籍[convex optimization](http://book.douban.com/subject/1888111/),主要包括凸优化的基本理论,主要的 ...
- bzoj4097 [Usaco2013 dec]Vacation Planning
Description Air Bovinia is planning to connect the N farms (1 <= N <= 200) that the cows live ...
- Introduction to Web Services
What are Web Services? Web Services are client and server applications that communicate over the Wor ...
- otl获得sql出错位置(oracle)
项目的一个需要,要获得sql出错的位置,从而给出类似sqlplus的错误提示(如下) sql出错原因易获得,记录在otl_exception::msg,但出错位置就不是那么容易了. 默认情况下otl异 ...