在前面的示例中,只要用戶名密碼保持一致,就可以直接登錄了,而在實際的應用系統中,都需要從應用數據庫中讀取用戶名和密碼,下面就進行自定義CAS服務器的數據源的實驗。
準備數據庫
在mysql數據庫test中新建表user
CREATE TABLE `user` (
`username` varchar(46) NOT NULL,
`password` varchar(46) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
爲該表增加兩條數據(密碼使用MD5加密):
insert into user(username,password) values('dylan',md5('dylan'));
insert into user(username,password) values('admin',md5('admin'));
cas服務器配置
打開cas-server的WEB-INF/deployerConfigContext.xml文件,找到其中的authenticationManager的authenticationHandlers屬性配置。默認的配置是這樣的:
<list>
<!-- ... -->
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false" />
<!-- ... -->
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
</list>
可以看到這裏配置了一個SimpleTestUsernamePasswordAuthenticationHandler,這個用戶名密碼的認證器在認證用戶時,只要用戶名和密碼保持一致,就認爲是有效的用戶,這也是爲什麼在前面的測試中,只要輸入的用戶名和密碼一致就能登錄的原因。在實際的生產環境中,應該將該認證器取消掉。如換成如下的認證器:
xml代碼:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource">
<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?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
</property>
<property name="sql" value="select password from user where username=? " />
<property name="passwordEncoder">
<bean class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-arg value="MD5" />
</bean>
</property>
</bean>
該認證器可以從數據表user中查詢用戶密碼,並對密碼進行MD5加密校驗,這個認證器位於cas-server-support-jdbc包中,需要在項目中增加相應的jar包。如果使用的是maven配置,配置POM如下:
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>3.3.1</version>
</dependency>
這裏用到了mysql的JDBC驅動,需要將相應的jar包加入cas服務器的lib目錄。
配置文件中可以看到,這裏的認證器配置的是一個list,默認情況下,只要有一個認證器通過認證,就認爲是合法的用戶,建議選擇合適的認證器放在最前面。
測試
重新啓動cas-server,進入登錄頁面,分別嘗試使用四組用戶進行測試:admin/admin,dylan/dylan,test/test,dylan/123456進行測試,結果前兩組登錄通過,後兩組登錄失敗,驗證成功。
參考資料:
http://wenku.baidu.com/view/f0b268d084254b35eefd34b8.html
http://www.blogjava.net/tufanshu/archive/2011/01/21/343290.html
http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
http://zxs19861202.iteye.com/blog/855856
http://www.cnblogs.com/hellowood/archive/2010/08/05/1793364.html