CAS 实现单点登录(SSO)数据库查询认证机制-自定义编码方式(四)

通过xml配置方式实现数据库查询认证,的确简单但是不够灵活。但是如果登录验证逻辑稍微复杂些,可能通过这种配置方式就不能满足需求了,比如:当用户登录时,需要判断该用户是否绑定了邮箱,如果未绑定,拒绝登录并给出提示信息。

遇到类似的情况,就需要使用自定义登录来完成,并且给出的提示信息也需要是自定义的。 

自定义登录验证(默认实现QueryDatabaseAuthenticationHandler

CAS内置了一些AuthenticationHandler实现类,如下图所示,在cas-server-support-jdbc包中提供了基于jdbc的用户认证类。

如果需要实现自定义登录,只需要实现org.jasig.cas.authentication.handler.AuthenticationHandler接口即可,当然也可以利用已有的实现,比如创建一个继承自org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler的类,实现方法可以参考org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler类:

修改authenticateUsernamePasswordInternal方法中的代码为自己的认证逻辑即可。

操作步骤:

1,Eclipse中引入cas-server-webapp项目,并在lib下添加两个jar包

2,自定义一个类,这个类的内容可以是复制QueryDatabaseAuthenticationHandler

类中的核心方法:

@Override
    protected final boolean authenticateUsernamePasswordInternal(final UsernamePasswordCredentials credentials) throws AuthenticationException {
        //获取前台传递过来的值,用户名和密码
    	final String username = getPrincipalNameTransformer().transform(credentials.getUsername());
        final String password = credentials.getPassword();
        final String encryptedPassword = this.getPasswordEncoder().encode(
            password);

        try {
        	/**
        	 * 以下的代码为CAS的数据库认证默认实现,如果想编写自己的实现方式,可以删除一下代码实现自己的登录认证
        	 */
        	//sql为配置文件中配置的sql语句
        	final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
            return dbPassword.equals(encryptedPassword);

            } catch (final IncorrectResultSizeDataAccessException e) {
            // this means the username was not found.
            return false;
        }
    }

3,根据业务需求编写自己的自定义登录方法,修改如下代码即可

final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
return dbPassword.equals(encryptedPassword);

当然也可以访问进行

http://localhost:8080/cas-server-webapp/login 调试。

4,配置使自定义登录认证生效

<!-- 注释掉默认的配置,使用自定义类配置 -->
				<!-- <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
					<property name="dataSource" ref="dataSource" ></property>
					<property name="sql" value="select password from t_user where login_name=?" ></property>
					<property name="passwordEncoder" ref="MD5PasswordEncoder" ></property>
				</bean> -->
				<bean class="com.tgb.handler.CustomQueryDBHandler">
					<property name="dataSource" ref="dataSource" ></property>
					<property name="sql" value="select password from t_user where login_name=?" ></property>
					<!-- <property name="passwordEncoder" ref="MD5PasswordEncoder" ></property> -->
				</bean>

完成以上步骤,自定义登录即可实现!

自定义错误提示消息(默认实现IncorrectResultSizeDataAccessException继承自RuntimeException)

CAS AuthenticationException结构如下图,CAS已经内置了一些异常,比如用户名密码错误、未知的用户名错误等。

当用户名输入正确,而密码错误时提示“密码错误”

只需要在自定义的AuthenticationHandler类的验证方法中,验证失败的地方抛出异常即可。

密码错误的异常类:

请注意代码中的CODE私有属性,该属性定义了一个本地化资源文件中的键,通过该键获取本地化资源中对应语言的文字,这里只实现中文错误消息提示,修改WEB-INF/classes/messages_zh_CN.properties文件,添加CODE定义的键值对,如下示例:

error.authentication.credentials.bad.usernameorpassword.password=\u5bc6\u7801\u9519\u8bef

后面的文字是使用jdk自带的native2ascii编码工具:native2ascii转换成utf-8格式。

接下来只需要在自定义的AuthenticationHandler类的验证方法中,验证失败的地方抛出异常即可。

自定义AuthenticationHandler示例代码如下:

@Override
    protected final boolean authenticateUsernamePasswordInternal(final UsernamePasswordCredentials credentials) throws AuthenticationException {
        //获取前台传递过来的值,用户名和密码
    	final String username = getPrincipalNameTransformer().transform(credentials.getUsername());
        final String password = credentials.getPassword();
        final String encryptedPassword = this.getPasswordEncoder().encode(
            password);

        try {
        	  final String dbPassword = null;
            if (dbPassword == null || dbPassword == "") {
				throw new BadPasswordAuthenticationException();
			}
            return dbPassword.equals(encryptedPassword);
        } catch (final IncorrectResultSizeDataAccessException e) {
            // this means the username was not found.
            return false;
        }

配置使自定义错误提示生效 同上(配置自定义登录认证)!

效果:

总结:

通过以上的学习,我们知道CAS为我们提供了很多便利的扩展功能,它的这种方式也是我们在设计软件时必须要考虑和不断要加强的内容。

时间: 2024-10-11 03:48:56

CAS 实现单点登录(SSO)数据库查询认证机制-自定义编码方式(四)的相关文章

CAS 实现单点登录(SSO)数据库查询认证机制-xml方式(三)

继前面介绍过基于CAS实现单点登录(SSO)的实例演示,演示过程中服务端认证机制采用的是默认配置即CAS Servier默认用户名和密码一致即可登录成功,那么本文将侧重于应用方面,真正通过查询用户名密码来进程验证用户是否可以登录. CAS Server添加相关的jar包 需要在web项目的lib下添加两个包:cas-server-support-jdbc-x.x.x.jar和 mysql-connector-java-x.x.x-bin.jar(具体版本号根据情况而定) 修改CAS Server

Atitit. 单点登录sso 的解决方案 总结

Atitit.  单点登录sso 的解决方案 总结 1. 系统应用场景and SSO模式选型 2 2. 系统应用的原则与要求 2 2.1. 开发快速简单::绝大部分系统来说,开发快速简单为主 2 2.2. 支持token交换,这样有利于集成先有的系统模块无需大改动,仅仅需要改动登陆模块.. 2 2.3. 支持用户名映射.当多个子系统username不同时候儿 2 3. 脱机验证sso (分散认证,类似护照的识别方式) 2 3.1. 适合场景:: 高性能场景,支持单方面改造 3 3.2. 缺点::

(四)SSO之CAS框架单点登录,修改验证数据库的方式

应需求的变化,在登录cas的时候,默认根据用户名和密码进行验证,如果加上用户名,密码和一个系统标识进行验证呢?该如何做呢? 我们知道cas默认的登录界面中,输入的用户名和密码,再配置一下deployerConfigContext.xml 这个文件中的bean  org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler 的这个标签,写上对应的sql,以及在<bean id="dataSource" class=&q

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

转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server), 官网:http://www.jasig.org/cas 本教程环境: Tomcat

JAVA CAS单点登录(SSO) 教程

一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server),官网:http://www.jasig.org/cas 本教程环境: Tomcat6.0.29 JDK6 CAS Server版本:cas-server-3.4.3.1 CAS Client版本:cas-client-3.1.12 教程撰写日期:2010-11-

CAS数据库查询认证(xml配置)

上篇博客介绍的CAS的Demo,登录界面用户名.密码并没有通过数据库查询认证.本博客,将介绍如何通过xml配置,进行CAS登录数据库查询认证. 所需数据库sso_cas,库中的表:tb_user,表中字段:Id.username.password: 数据库查询认证(通过xml配置) 1,修改cas服务端配置 tomcat下webapps/cas/WEB_INF/deployerConfigContext.xml 文件做如下修改: <beanclass="org.jasig.cas.auth

cas 单点登录(SSO)实验之二: cas-client

cas 单点登录(SSO)实验之二: cas-client 參考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenku.baidu.com/view/0bcc0d01e87101f69e319595.html 接上一篇文章: cas 单点登录(SSO)实验之中的一个: jasig cas-server 安装 本文说明怎样写一个web服务(cas-study).使用cas-server提供的验证服务.当用户訪问这个

cas 单点登录(SSO)之一: jasig cas-server 安装

cas 单点登录(SSO)实验之一: jasig cas-server 安装 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenku.baidu.com/view/0bcc0d01e87101f69e319595.html SSO原理不多重复,需要理解的就一点,一个复杂系统需要一个唯一的验证服务, 这就是CAS(Central Authentication Service) Server.系统内的各种服务(W

Springboot集成Shiro和Cas实现单点登录(服务端篇CAS5)

什么是单点登录? 先说一个需求场景,比如:一个企业的内部有N多个子系统,每个子系统都有一套自己的用户名和密码,那么企业的员工要登录N个子系统,这样一个员工 就要记住N个用户名和密码,就算各个子系统的用户名和密码都是统一的,登录每个子系统都要输入用户名和密码进行登录也是一个繁琐的操作过程,那么单点登录功能由此便应运而生了.单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应