1. 程式人生 > >CAS實現單點登入(二):自定義的使用者驗證登入

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"
/>

修改為:

<bean 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"
/> </bean>

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資料庫中使用者名稱和密碼:

這裡寫圖片描述

這裡寫圖片描述

輸入使用者名稱和密碼kxl/kxlpwd,點選登入:

這裡寫圖片描述

補充說明:

  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專案中。

這裡寫圖片描述

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類的實現吧(這裡我不重新寫驗證的邏輯,直接複製它裡面的方法。只需要說明我們自己定義的處理器類是可用的就行。)

這裡寫圖片描述

程式碼:

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:

注意在eclipse中給這個專案新增server,注意應該新增我們的上一篇博文裡的tomcat_cas伺服器,別新增其他的tomcat了,tomcat_cas裡面還配置一些東西的。否則還得重新配置。