CAS实现单点登入(二):自定义的用户验证登入

上一篇演示单点登入服务端认证机制采用的是cas server默认的用户名和密码(admin/admin)。今天介绍正常项目中如何通过验证DB中的用户数据,来验证用户的密码的合法性
自定义验证登入有两种方式:

  • 采用cas-server默认的数据库查询认证扩展方法
  • 采用我们自己定义的查询认证方法

一:采用cas-server默认的数据库查询认证扩展方法

我们上一篇博客用的最简单的SimpleTestUsernamePasswordAuthentica去验证用户名密码,而cas自带
QueryDatabaseAuthenticationHandler和SearchModeSearchDatabaseAuthenticationHandler这两个类作为JDBC方式验证用户的处理器。这两个处理类位于cas-server-support-jdbc这个扩展工程下。
1、添加cas支持db相关的jar包,以及mysql的驱动包
在D:\soft\apache-tomcat-7.0.55\tomcat_cas\webapps\cas\WEB-INF\lib目录添加下面两个jar包:

cas-server-support-jdbc-3.4.10
mysql-connector-java-3.1.12-bin.jar

2.修改cas-server相关的配置文件:

修改D:\soft\apache-tomcat-7.0.55\tomcat_cas\webapps\cas\WEB-INF\deployerConfigContext.xml文件:
找到 :

 <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />  

修改为:

class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
    <property name="dataSource" ref="dataSource"/>
    <property name="sql" value="select password from t_user where name=?" />
    <property name="passwordEncoder" ref="MD5PasswordEncoder" />
 

3、初始化dataSouce和定义加密器:

<bean id="dataSource"  
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
            <property name="url" value="jdbc:mysql://localhost:3306/test" />  
            <property name="username" value="root" />  
            <property name="password" value="root" />  
bean>  
    <bean id="MD5PasswordEncoder"  
            class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">  
            <constructor-arg index="0" value="MD5" />  
bean> 

4.在mysql数据库中用户名和密码:

CAS实现单点登入(二):自定义的用户验证登入_第1张图片

5.测试
输入sso验证登入页面https://sso.kxl.com:8443/cas/login。

CAS实现单点登入(二):自定义的用户验证登入_第2张图片

输入用户名和密码kxl/kxlpwd,点击登入:

CAS实现单点登入(二):自定义的用户验证登入_第3张图片

补充说明:

  1. 数据源可以采用其他的数据库oracle等,本文采用的是mysql。
  2. 密码加密可以取消注释掉不用,本文采用的加密器是默认的DefaultPasswordEncoder,实际项目中可以定义自己的加密器,只要实现 PasswordEncoder 接口及其 encode() 方法。

二:采用我们自己定义的查询认证方法


上面的方式虽然简单,但不太灵活,实际项目中,可能还要验证其他的数据,或者有的项目有自己的一套数据校验方式,那么采用这种方式就不太合适,我们可以自己定义验证的处理器。

1.导入cas-server的项目到eclipse

找到我们下载的cas-server,将目录地址…\cas\cas-server-3.4.10-release\cas-server-3.4.10\modules下的cas-server-webapp-3.4.10.war导入到我们的eclipse项目中。

CAS实现单点登入(二):自定义的用户验证登入_第4张图片

2.引入相关jar包
cas-server-support-jdbc-3.4.10
mysql-connector-java-3.1.12-bin.jar复制到项目的WEB-INF/lib目录下

3.自定义一个用户验证处理器

实现自定义登录,只需要实现org.jasig.cas.authentication.handler.AuthenticationHandler接口即可,
或者继承org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler类,
比如org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler类的实现,可以参照一下。
我们自己的验证处理器就模仿QueryDatabaseAuthenticationHandler类的实现吧(这里我不重新写验证的逻辑,直接复制它里面的方法。只需要说明我们自己定义的处理器类是可用的就行。)

CAS实现单点登入(二):自定义的用户验证登入_第5张图片

代码:

package com.mydefined.handler;
import javax.validation.constraints.NotNull;
import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException;

public class MyDefinedDBHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {

    @NotNull
    private String sql;
    protected final boolean authenticateUsernamePasswordInternal(
            UsernamePasswordCredentials credentials)
            throws AuthenticationException {

        System.out.println("=========我们自己的处理器=======");

        String username = getPrincipalNameTransformer().transform(
                credentials.getUsername());
        String password = credentials.getPassword();
        String encryptedPassword = getPasswordEncoder().encode(password);
        try {
            String dbPassword = (String) getJdbcTemplate().queryForObject(sql,
                    String.class, new Object[] { username });

            return dbPassword.equals(encryptedPassword);
        } catch (IncorrectResultSizeDataAccessException localIncorrectResultSizeDataAccessException) {
        }
        return false;
    }
    public String getSql() {
        return sql;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }
}

4.配置文件里修改登入验证方式
项目的\WEB-INF\deployerConfigContext.xml文件中引入我们自己的处理器MyDefinedDBHander:

CAS实现单点登入(二):自定义的用户验证登入_第6张图片

注意在eclipse中给这个项目添加server,注意应该添加我们的上一篇博文里的tomcat_cas服务器,别添加其他的tomcat了,tomcat_cas里面还配置一些东西的。否则还得重新配置。

输入https://sso.kxl.com:8443/cas-server-webapp-3.4.10/login进行验证吧。用户名密码kxl/kxlpwd

你可能感兴趣的:(单点登入(SSO)-CAS)