问题:

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使用记(三):实现自定义验证用户登录的更多相关文章

  1. 单点登录CAS使用记(四):为登录页面加上验证码

    CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...

  2. 单点登录CAS使用记(一):前期准备以及为CAS-Server配置SSL协议

    知识点: SSO:单点登录(Single Sign On),是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS:耶 ...

  3. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

  4. 单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。

    一.问题在哪? 在配置cas-client中,有这么一段配置: <filter> <filter-name>CAS Filter</filter-name> < ...

  5. 单点登录CAS使用记(六):单点登出、单点注销

    单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...

  6. 单点登录CAS使用记(七):关于服务器超时以及客户端超时的分析

    我的预想情况 一般情况下,当用户登录一个站点后,如果长时间没有发生任何动作,当用户再次点击时,会被强制登出并且跳转到登录页面, 提醒用户重新登录.现在我已经为站点整合了CAS,并且已经实现了单点登录以 ...

  7. 单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS

    前期在学习CAS部署的过程中,都是网上各种教程,各种方案不停的尝试. 期间各种侵入改源码,时间久了,改了哪个文件,改了哪段配置,增加了哪段代码,都有可能混淆不清了. 而且最大的问题是,万一换个人来维护 ...

  8. 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 ...

  9. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

    首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写 ...

随机推荐

  1. jdbc(1)(一)

    1.连接数据库,准备mysql连接jar包导入项目: Class.forName("com.mysql.jdbc.Driver"); //建立连接是比较耗时,耗资源的,实际开发中多 ...

  2. Chapter 2. OpenSSL的安装和配置学习笔记

    Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...

  3. C语言学习笔记--结构体

    结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...

  4. java签名证书

    import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; impo ...

  5. 【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个盒子中,混合排列, ...

  6. GCC依赖库顺序问题

    今天在把linux下做的ipmsg移植到windows过程中,因为包含了一个开源库SimpleSocket,而这个库又引用了winsock2,没太注意就写下了下面的makefile: g++ -o t ...

  7. convex optimization

    ##凸优化总结所有这些想法基本是来自于书籍[convex optimization](http://book.douban.com/subject/1888111/),主要包括凸优化的基本理论,主要的 ...

  8. bzoj4097 [Usaco2013 dec]Vacation Planning

    Description Air Bovinia is planning to connect the N farms (1 <= N <= 200) that the cows live ...

  9. Introduction to Web Services

    What are Web Services? Web Services are client and server applications that communicate over the Wor ...

  10. otl获得sql出错位置(oracle)

    项目的一个需要,要获得sql出错的位置,从而给出类似sqlplus的错误提示(如下) sql出错原因易获得,记录在otl_exception::msg,但出错位置就不是那么容易了. 默认情况下otl异 ...