在前面的示例中,使用的用户名和密码都是自己捏造出来的,而在实际的应用系统中,都需要从应用数据库中读取用户名和密码,下面就进行自定义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,这个用户名密码的认证器在认证用户时,只要用户名和密码保持一致,就认为是有效的用户,这也是为什么在前面的测试中,只要输入的用户名和密码一致就能登录的原因。在实际的生产环境中,应该将该认证器取消掉。如换成如下的认证器:
<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>${project.version}</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