CAS 單點登陸【2】自定義用戶驗證

   基礎不太熟的同窗能夠先去看:CAS 單點登陸【1】入門html

方案1:CAS默認的JDBC擴展方案:java

CAS自帶了兩種簡單的經過JDBC方式驗證用戶的處理器。mysql

1.QueryDatabaseAuthenticationHandler

2.SearchModeSearchDatabaseAuthenticationHandler

這兩個處理類位於cas-server-support-jdbc這個擴展工程下。web

第一步:改寫用戶驗證處理器sql

   deployerConfigContext.xml數據庫

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

   把他替換成爲 下面兩種其中任意一個bean皆可。apache

<bean id="SearchModeSearchDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
  <property  name="tableUsers">
   <value>users</value>
  </property>
  <property name="fieldUser">
   <value>user_id</value>
  </property>
  <property name="fieldPassword">
   <value>password</value>
  </property>
  <property name="dataSource" ref="dataSource" />
</bean>

或者oracle

 <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
  <property name="dataSource" ref="dataSource" />
  <property name="sql" value="select password from some_table where lower(username) = lower(?)" />
</bean>

把對應的用戶表名、用戶名、密碼替換成爲 你實際數據庫中的 用戶表名、用戶名、密碼對應的字段名稱。app

第二步:加載驅動(oracle、mysql任選一種),鏈接數據庫webapp

依然在這個文件中deployerConfigContext.xml,在最後一個</bean>標籤以前,加上下面配置便可(oracle、mysql任選其一)。

   <!-- Oracle connector -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
            <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
            <value>jdbc:oracle:thin:@database-server-name:1521:SID</value>
        </property>
        <property name="username">
            <value>admusr</value>
        </property>
        <property name="password">
            <value>admpwd</value>
        </property>
    </bean>

    <!-- MySQL connector -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://database-server-name:3306/db-name</value>
        </property>
        <property name="username">
            <value>admusr</value>
        </property>
        <property name="password">
            <value>admpwd</value>
        </property>
    </bean>

第三步:導入必要的jar包

cas-server-webapp的pom.xml

<!-- 必須導入start -->
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.2.1</version>
    <scope>runtime</scope>
</dependency>
<!-- 必須導入end -->

<!-- oracle 、 mysql 任選其一 start-->
<dependency>
    <groupId>oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.4</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.5</version>
    <scope>provided</scope>
</dependency>
<!-- oracle 、 mysql 任選其一 end-->

從新啓動項目,在登陸頁驗證便可。

方案2:套用原有項目的用戶登陸邏輯(非JDBC方式

背景:

1.由於是要整合多個項目的登陸功能,換句話說,就是原有的項目其實分別都有已經實現的用戶登陸邏輯頁面、登陸邏輯,而且是通過了大量測試,程序邏輯比較健壯。

2.原有的項目並非經過JDBC方式來訪問數據庫的,爲了保持代碼風格統一,最好與其餘項目保持一致,或者直接套用原有的驗證邏輯。(好比:咱們項目使用的是Mybatis方式)

3.CAS擴展的JDBC驗證方式仍是過於簡單,對於複雜的驗證邏輯不便於擴展。

第一步:自定義一個用戶驗證處理器

能夠在原有的cas-server-support-jdbc工程下,也能夠本身新建一個工程

注意:本類要繼承這個類AbstractUsernamePasswordAuthenticationHandler

public final class MyUserAuthenticationHandler extends
        AbstractUsernamePasswordAuthenticationHandler
{
    /**
     * 這個API是原有項目驗證用戶相關處理的API,直接導入相關jar包就可使用
     */
    @Autowired
    private UserApi userApi;
    
    @Override
    protected final boolean authenticateUsernamePasswordInternal(
            final UsernamePasswordCredentials credentials)
            throws MyAuthenticationException
    {
        String username = getPrincipalNameTransformer().transform(credentials.getUsername());
        String password = credentials.getPassword();
        try
        {
            userApi.login(username, password);
        }
        catch (Exception e)
        {
            throw new MyAuthenticationException(e);
        }
        return true;
    }
}

第二步:自定義異常處理器

   由於CAS原有的異常處理邏輯是,只能經過errorcode去messages_zh_CN.properties尋找已經中定義好的異常消息,

   若是找不到直接返回errorcode到頁面,並不支持直接拋出文字形式的異常消息。還須要爲每種異常都定義專屬的異常類,例如:

   BadCredentialsAuthenticationException.java

   BadPasswordAuthenticationException.java

   BadUsernameOrPasswordAuthenticationException.java

   而本異常類能夠直接接受Api拋出的全部異常,或者也能夠自定義文字形式的異常消息。如:new Exception("這是異常消息")

   一樣也支持原有的根據errorCode讀取異常消息的方式。

public final class MyAuthenticationException extends
        AuthenticationException
{
    
    /** Serializable ID. */
    private static final long serialVersionUID = 3906648604830611762L;
    
    /**
     * 本構造方法能夠返回任何自定義的異常消息到前臺
     * <p>例子:TongXiangAuthenticationException(new Exception("自定義的異常消息"))</p>
     */
    public MyAuthenticationException(final Throwable throwable)
    {
        super(throwable.getMessage());
    }
    
    /**
     * 本構造方法只能返回在messages_zh_CN.properties中已經定義好的異常消息
     */
    public MyAuthenticationException(final String code)
    {
        super(code);
    }

第三步:修改deployerConfigContext.xml

   方案1中,在配置文件中配置了

JDBC方式的處理器bean、鏈接數據庫的BasicDataSource bean 這裏通通不須要。

   直接找到這個處理器

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

   把他替換成爲自定義的驗證處理器。

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

由於,訪問數據庫以及驗證用戶邏輯的處理都在UserApi中作處理,不須要CAS再作處理了。

第四步:pom.xml加載自定義的工程或者被修改的工程jar包

cas-server-webapp的pom.xml

<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
    <version>${project.version}</version>
</dependency>

或者用戶自定義的項目

<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-myself</artifactId>
    <version>1.0</version>
</dependency>
相關文章
相關標籤/搜索