單點登錄系列之四---使用RDBMS認證

在實際應用中,用戶認證信息一般會存放在RDBMS或LDAP中,這樣能夠更好的保證系統的安全性。本節將採用RDBMS的存儲方式,通過一個簡單的實例展示其使用方法。

1.準備環境
操作系統:32位Window XP
CAS服務器:Cas Server 3.3.3
CAS客戶端:Cas Client 3.1.10
Web服務器:Tomcat 6.0.18
數據庫:MySQL 5.0

2.準備數據庫
2.1.創建數據庫

create database cas CHARSET=utf8;


2.2.創建用戶表
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`sex` varchar(2) NOT NULL,
`age` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


2.3.準備數據
INSERT INTO `users` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '男', '26');
INSERT INTO `users` VALUES ('2', 'javaee', '21232f297a57a5a743894a0e4a801fc3', '男', '26');
密碼均爲admin

3.添加數據庫信息
打開cas3的WEB-INF/cas.properties文件,添加數據庫相關信息:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
jdbc.username=root
jdbc.password=root
cas.auth.sql=select u.password from users u where lower(u.username) = lower(?)
其中,url、username、password根據實際情況進行修改。

4.添加Jar包
MySQL數據庫JDBC支持包:mysql-connector-java-5.1.9.jar
DBCP連接池支持包:commons-pool-1.2.jar、commons-dbcp- 1.2.1.jar
QueryDatabaseAuthenticationHandler使用Spring JDBC支持包:spring-jdbc-2.5.6.jar

JDBC認證處理器實現支持:cas-server-support-jdbc-3.3.3.jar


5.配置數據庫認證
5.1.認證管理器

  在講解如何使用數據庫認證之前,讓我們先來了解一下AuthenticationManagerImpl對象authenticationManager。authenticationManager對象用於認證用戶信息,在用戶登錄CAS時,將會使用該認證管理器進行認證。
AuthenticationManagerImpl實現了AuthenticationManager接口,接口定義如下:
public interface AuthenticationManager {

String AUTHENTICATION_METHOD_ATTRIBUTE = "authenticationMethod";

Authentication authenticate(final Credentials credentials)
throws AuthenticationException;
}

  AuthenticationManagerImpl藉助於AuthenticationHandler集合List<AuthenticationHandler>和CredentialsToPrincipalResolver集合List<CredentialsToPrincipalResolver>完成對用戶的認證工作。AuthenticationHandler負責完成用戶的認證工作,而CredentialsToPrincipalResolver負責構建認證結果。
  對於配置了多個AuthenticationHandler的實現,一旦其中一個認證處理器認證通過,其他認證處理器將不再執行。配置了多個CredentialsToPrincipalResolver的處理方式與AuthenticationHandler一致。

   至此,我們認識到如果要實現RDBMS認證,必須提供相應的AuthenticationHandler實現方式。那麼具體需要如何來實現,CAS爲我們提供了基本的JDBC支持包cas-server-support-jdbc-3.3.3.jar。在CAS中引入該包後,使用其實現類org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler將滿足我們的需要。接下來,我們開始進行配置:

5.2.修改配置文件deployerConfigContext.xml
打開cas3的WEB-INF/deployerConfigContext.xml文件


5.2.1.添加dbcp數據源配置

Xml代碼 收藏代碼
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  2. <property name="driverClassName" value="${jdbc.driver}" />
  3. <property name="url" value="${jdbc.url}" />
  4. <property name="username" value="${jdbc.username}" />
  5. <property name="password" value="${jdbc.password}" />
  6. </bean>


5.2.2.添加MD5加密編碼器

Xml代碼 收藏代碼
  1. <bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
  2. <constructor-arg value="MD5" />
  3. </bean>

5.2.3.添加RDBMS認證處理器
替換authenticationHandlers中的SimpleTestUsernamePasswordAuthenticationHandler認證處理器,代碼如下:

Xml代碼 收藏代碼
  1. <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
  2. <property name="dataSource" ref="dataSource" />
  3. <property name="sql" value="${cas.auth.sql}" />
  4. <property name="passwordEncoder" ref="passwordEncoder" />
  5. </bean>

5.2.4.驗證配置
  經過以上幾個步驟,對於數據庫認證的配置已經完成。接下來,我們啓動Tomcat進行測試。啓動完畢後,使用admin或javaee用戶登錄CAS認證服務器,如果登錄成功,我們將會在Tomcat日誌中看到類似信息:

  從日誌信息中可以看到,我們的確成功的藉助於QueryDatabaseAuthenticationHandler對用戶進行了認證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章