CAS实现SSO 学习(五)

原创 2015年07月09日 15:24:30

(五)扩展基于数据库的身份验证

1. 应用场景

前面提到的基于数据库的集中身份验证主要是通过用户名、密码的方式完成验证操作,然而在实际使用过程中,用户可能需要多种形式的认证手段,除了用户名密码的方式外,还可能通过邮箱或手机号登录,但不管使用何种方式登录,都对应同一用户。下例如淘宝网在登录时允许用户以“手机号/会员名/邮箱”三种方式登录系统。

2. 数据库设计

针对上述需求,重新设计数据库字段,如下图所示:

输入测试用数据.

3. 自定义数据库验证Handler

关于自定义数据库验证Handler的文章比较多,我主要参考了《CAS扩展——自定义查询数据库验证Handler》和《CAS重新实现登陆认证逻辑》。但是这两篇文章介绍的相对较糙,对于不了解Java的人来说实施起来着实有点困难,所以在这里我将两人的东西综合一下并给出详尽的操作流程供参考。

说明:大家可以从解压缩的“cas-server-3.5.2\cas-server-support-jdbc\src”文件夹下找到“QueryDatabaseAuthenticationHandler.java”的源代码以及其它相关源码供参考。

(1)安装Eclipse。Eclipse是非常常用的一种Java编辑器。为了完成组件编写,我们首先需要安装Eclipse。Eclipse的下载与安装非常简单,在这里就不再赘述。

(2)启动Eclipse,选择“File/New/Java Project”,打开新建项目对话框,在“Project Name”文本框中输入“MultiCriteriaQueryDatabaseAuthenticationHandler”,单击“Finish”按钮。如下图所示:


(3)在“Package Explorer”中右击项目“MultiCriteriaQueryDatabaseAuthenticationHandler”,选择“New/Folder”,在弹出的对话框中输入“lib”并单击“Finish”按钮。

(4)从解压缩的“cas-server-3.5.2\modules”文件夹中找到“cas-server-core-3.5.2.jar”与“cas-server-support-jdbc-3.5.2.jar”两个文件,将其拷贝到新建的“lib”文件夹下。

(5)从网上搜索并下载“spring.jar”与“javax.validation-1.0.0.GA.jar”两个文件,也将其拷贝到新建的“lib”文件夹。


(6)在“Package Explorer”中右击项目“MultiCriteriaQueryDatabaseAuthenticationHandler”,选择“Build Path/Add External Archives...”,依次将刚才拷贝到lib文件夹下的四个jar文件添加至项目的“Reference Libraries”中。


(7)在“src”文件夹上右击,选择“New/Class”,弹出新建Java类对话框。在Package文本框中输入“org.jasig.cas.adaptors.jdbc”,在Name文本框中输入“MultiCriteriaQueryDatabaseAuthenticationHandler”,单击“Finish”按钮。


(8)用下面的代码替换“MultiCriteriaQueryDatabaseAuthenticationHandler.java”文件中的现有代码,单击保存按钮保存修改。

protected final boolean authenticateUsernamePasswordInternal(
            UsernamePasswordCredentials credentials)
            throws AuthenticationException {
        final String id = getPrincipalNameTransformer().transform(
                credentials.getUsername());
        final String password = credentials.getPassword();
        final String encryptedPassword = this.getPasswordEncoder().encode(
                password);

        try {
            String dbPassword = getJdbcTemplate().queryForObject(
                    this.getPwdSql, String.class, new Object[] { id, id, id });

            String username = getJdbcTemplate().queryForObject(
                    this.getUsernameSql, String.class,
                    new Object[] { id, id, id });

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

    public void setGetPwdSql(final String getPwdSql) {
        this.getPwdSql = getPwdSql;
    }

    public void setGetUsernameSql(final String getUsernameSql) {
        this.getUsernameSql = getUsernameSql;
    }
}
(9)在“Package Explorer”中右击项目“MultiCriteriaQueryDatabaseAuthenticationHandler”,选择“Export...”打开Export对话框。
(10)在“Export”对话框中选择“JAR file”,单击“Next”按钮。


(11)在JAR文件设置对话框中,去掉“lib”文件夹前面的对勾,同时去掉“.classpath”和“.project”前面的对勾,选择JAR文件的保存路径到桌面,单击“Finish”按钮。


(12)将桌面上生成的“MultiCriteriaQueryDatabaseAuthenticationHandler.jar”文件拷贝至“%TOMCAT_HOME%\webapps\cas\WEB-INF\lib”文件夹下。

(13)以管理员身份启动文本编辑器,打开“%TOMCAT_HOME%\webapps\cas\WEB-INF\deployerConfigContext.xml”。找到下面的代码(这段代码是上篇博文中我们添加进去的):

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name="sql" value="select Password from users where username=?" />
    <property name="dataSource" ref="dataSource" />
</bean>

(14)将上面这段代码注释掉,并在其下插入如下配置信息并保存:

<bean class="org.jasig.cas.adaptors.jdbc.MultiCriteriaQueryDatabaseAuthenticationHandler">  
  <property name="getPwdSql" value="select password from users where username=? or email=? or mobile=?" />  
  <property name="getUsernameSql" value="select username from users where username=? or email=? or mobile=?" />  
  <property name="dataSource" ref="dataSource" />  
</bean>

如图:


(15)重新启动Tomcat服务。


4.测试自定义数据库身份验证Handler

从客户端运行前面调试好的WebForm程序,输入库中用户名或邮箱或手机号、密码,测试是否登录成功。可以看到,不管用户使用邮件还是手机号登录,客户端始终显示用户名,而非邮箱和手机号。这是因为在MultiCriteriaQueryDatabaseAuthenticationHandler.java代码中如下代码所决定的:

String username = getJdbcTemplate().queryForObject(
        this.getUsernameSql, String.class,
        new Object[] { id, id, id });

credentials.setUsername(username);

登录后的用户界面如下图所示:


版权声明:本文为博主原创文章,未经博主允许不得转载。

(一)SSO之CAS框架通俗原理

SSO统一验证 SSO(Single Sign On ),SSO统一验证的目的是为了让多个系统
  • lovesummerforever
  • lovesummerforever
  • 2014年06月30日 23:50
  • 7381

CAS实现单点登录SSO执行原理探究(终于明白了)

一、不落俗套的开始1、背景介绍单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS框架:CAS(Central A...
  • javaloveiphone
  • javaloveiphone
  • 2016年09月05日 13:56
  • 55777

CAS 实现单点登录(SSO)简单实例demo(二)

本文目的很明确,并不是要逐步讲清楚每一步的操作,具体的步骤网上有很多,那么整理本文的目的只是要梳理一下自己的知识点,帮助自己加深理解。   小知识点积累:   域名地址的修改:   根据演示需求,用修...
  • hejingyuan6
  • hejingyuan6
  • 2015年04月07日 16:55
  • 12438

CAS实现单点登录(sso)搭建流程 服务器端搭建

一、简介 1、cas是有耶鲁大学研发的单点登录服务器 2、所用环境 ·        Linux系统 ·        Tomcat7.0 ·        JDK1.7 ·        CAS S...
  • cailianren1
  • cailianren1
  • 2015年06月11日 14:35
  • 1619

SSO CAS原理浅谈

1. CAS简介    SSO是一个非常大的主题,我对这个主题有着深深的感受,自从广州UserGroup的论坛成立以来,无数网友都在尝试使用开源的CAS,Kerberos也提供另外一种方式的SSO,...
  • romantic_PK
  • romantic_PK
  • 2016年10月03日 01:01
  • 923

CAS实现单点登录(sso)搭建流程 服务器端搭建

一、简介 1、cas是有耶鲁大学研发的单点登录服务器 2、所用环境 ·        Linux系统 ·        Tomcat7.0 ·        JDK1.7 ·       ...
  • hegaoye308444582
  • hegaoye308444582
  • 2016年11月19日 13:05
  • 1419

CAS SSO基本工作原理

下面分析下CAS SSO(以3.4.5为例)的基本工作原理。先假定一个应用场景,如图,有两个Web应用分别是webapp1、webapp2(Spring Security 3应用) 。一个认证服务器C...
  • caomiao2006
  • caomiao2006
  • 2015年03月30日 00:46
  • 1047

单点登录之CAS SSO从入门到精通(第一天)

啊。。。。。。it's quite a long time。好久没更新博客了,有一年之久了,一直在忙于公司的一些项目。2014年到2015年工作太忙,对于一些经常跟我博客的读者们深深说一声抱歉。同时,...
  • lifetragedy
  • lifetragedy
  • 2015年02月14日 20:05
  • 33741

(二)SSO之CAS框架单点退出,自定义退出界面.

用了CAS,发现退出真是个麻烦事,退出后跳转到了CAS的注销页面,而且不关闭浏览器的话,其实并没有真的退出,输入地址仍是登陆状态。为了实现退出后登陆到跳转页面,做了以下配置: 1.server...
  • lovesummerforever
  • lovesummerforever
  • 2014年07月02日 10:45
  • 11067

单点登录之CAS SSO从入门到精通(第二天)

啊。。。。。。沙滩,阳光,笔记本往膝上一搁,开始写博客。第一次没在国内过年,避开了吃吃吃,感觉真好,人也觉得轻松多了。上次说到了CAS SSO最基本的使用方法,并且我们结合了一个数据库表来实现了我们自...
  • lifetragedy
  • lifetragedy
  • 2015年02月22日 20:20
  • 11800
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CAS实现SSO 学习(五)
举报原因:
原因补充:

(最多只允许输入30个字)