zoukankan      html  css  js  c++  java
  • (转)Yale CAS + .net Client 实现 SSO(5)

    • 第一部分:安装配置 Tomcat
    • 第二部分:安装配置 CAS
    • 第三部分:实现 ASP.NET WebForm Client
    • 第四部分:实现基于数据库的身份验证

    第五部分:扩展基于数据库的身份验证

    1. 应用场景

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

    CAS005001

    2. 数据库设计

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

    CAS005002

    输入测试用数据,如下图所示:

    CAS005003

    3. 自定义数据库验证Handler

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

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

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

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

    CAS005004

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

    CAS005005

    CAS005006

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

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

    CAS005007

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

    CAS005008

    CAS005009

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

    CAS005010

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

    复制代码
    package org.jasig.cas.adaptors.jdbc;
    
    import org.jasig.cas.authentication.handler.AuthenticationException;
    import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
    import org.springframework.dao.IncorrectResultSizeDataAccessException;
    
    import javax.validation.constraints.NotNull;
    
    public class MultiCriteriaQueryDatabaseAuthenticationHandler extends
            AbstractJdbcUsernamePasswordAuthenticationHandler {
    
        @NotNull
        private String getPwdSql;
    
        @NotNull
        private String getUsernameSql;
    
        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对话框。

    CAS005011

    (10)在“Export”对话框中选择“JAR file”,单击“Next”按钮。

    CAS005012

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

    CAS005013

    (12)将桌面上生成的“MultiCriteriaQueryDatabaseAuthenticationHandler.jar”文件拷贝至“%TOMCAT_HOME%webappscasWEB-INFlib”文件夹下。

    (13)以管理员身份启动文本编辑器,打开“%TOMCAT_HOME%webappscasWEB-INFdeployerConfigContext.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>

    CAS005014

    (15)重新启动Tomcat服务。

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

    从客户端运行前面调试好的WebForm程序(请参考:Yale CAS + .net Client 实现 SSO(3)),输入用户名“admin”或“admin@163.com”或“12345678901”、密码“123”,测试是否登录成功。可以看到,不管用户使用邮件还是手机号登录,客户端始终显示用户名,而非邮箱和手机号。这是因为在MultiCriteriaQueryDatabaseAuthenticationHandler.java代码中如下代码所决定的:

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

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

    CAS005015

  • 相关阅读:
    A Deep Dive Into Draggable and DragTarget in Flutter
    使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
    XmlDocument.load 读文件报异常:文件正被其它线程使用,解决方法
    拼多多是怎么骗你的?
    东北话中的满语
    唐郑国公魏征金口“斩龙台”梦斩泾河黄龙的传说
    Asp.Net Form表单控件的回车默认事件
    UpdatePanel 控件,客户端事件生命周期踩坑
    Javascript 严格模式(strict mode)详解
    代数、几何、分析 各自的范畴
  • 原文地址:https://www.cnblogs.com/ywcz060/p/4760112.html
Copyright © 2011-2022 走看看