此配置要求先配置了JDBC连接数据库,如果没连到数据库的,可能不一定能实现:
配置jdbc连接MySql:https://my.oschina.net/u/2541179/blog/757505
配置MD5需要修改deployerConfigContext.xml;
配置完JDBC时,有一段<alias> 如下:
<alias name="queryDatabaseAuthenticationHandler" alias="primaryAuthenticationHandler" />
将此项修改为:(注释掉,新加以下内容)
<bean id = "queryDatabaseAuthenticationHandler" name="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="passwordEncoder" ref="MD5PasswordEncoder"/>
</bean>
简单说明一下(大神请忽略):其实alias就是简写的bean,但是alias是不能加<property>的,所以给它修改成<bean>标签,【name=】变为【id=】 ,【alias=】 变为 【name=】,增加【class=】属性,至于class里的值是怎么来的,百度,谷歌,官方文档,读源码。。。。
然后property里配置的内容,需要增加以下的bean,进行匹配:
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
ref 和 id 做对应。
这样保存后,重启tomcat就行了。有一点需要吐槽一下:
这样的配置是通过cas自带的MD5加密来进行加密的,有个十分恶心的bug,就是数据库中的MD5串必须是小写的字母,否则验证失败,读了一下源码:org.jasig.cas.authentication.handler.DefaultPasswordEncoder
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f'};
这里面都是小写字母,然后在:org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler
这个类里面做比对的时候并没有对两个比对项做大小写忽略,我们数据库的密码写的MD5Util把这块都变成大写了,然后就苦逼的调了半天,不知道为什么校验不过去,读了源码才知道怎么回事。
此处提供2个解决方案:
简单粗暴的:数据库里的md5改成小写字母。(→ _→|||)
高大上的:自定义加密类:
<bean id="MD5PasswordEncoder" class="xxx.xxx.MyMD5" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
然后把这个类编译成class,扔到cas里,或是打到原jar包中。
当然了,这个自定义加密类就不一定是MD5了,只要实现cas的 org.jasig.cas.authentication.handler.PasswordEncoder 接口,重写encode方法就行啦。
这个接口在:cas-server-core-api-authentication里面,感兴趣的写一个玩玩吧。。