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,點選登入:
補充說明:
- 資料來源可以採用其他的資料庫oracle等,本文采用的是mysql。
- 密碼加密可以取消註釋掉不用,本文采用的加密器是預設的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裡面還配置一些東西的。否則還得重新配置。