问题由来
⽤于CAS系统登录的密码默认提供MD5和SHA加密的算法⽀持,但有时由于业务需要,以上两种算法都不能提供⾜够的⽀持,这时我们就需要⾃定义加密算法。⽐如笔者遇到的⼀个项⽬,密码的加密⽅式,是将密码MD5加密后再拼接数据库中⼀个盐值然后再MD5⼆次加密,这样的需求条件就必须对加密算法进⾏扩展。
解决⽅案
CAS⽀持的加密⽅式(MD5/SHA)配置⽅法:
在tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml先找到:
1:
修改为:
1: 3:
QueryDatabaseAuthenticationHandler是cas-server-support-jdbc提供的查询接⼝其中⼀个是通过配置⼀个 SQL 语句查出密码,与所给密码匹配;dataSource是使⽤JDBC查询时的数据源;sql语句的⽤意是把符合该ID的⽤户密码取出来,cas会⽤它与⽤户输⼊的密码进⾏⽐对。passwordEncoder是加密算法,表⽰将⽤户输⼊的密码以何种⽅式进⾏加密,然后CAS会将此加密结果与数据库中取出来的密码进⾏⽐对。
最后在tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml末尾配置:
1:
8:
1:
也就是说我们只需要⾃定义⼀个加密类,将它装配进来就可以了,于是我们新建⼀个类(注意此类应该实现CAS的PasswordEncoder接⼝):
1: public class UCPasswordEncoder implements PasswordEncoder { 2: private String salt; 3:
4: /**
5: * @return the salt 6: */
7: public String getSalt() { 8: return salt; 9: } 10:
11: /**
12: * @param salt
13: * the salt to set 14: */
15: public void setSalt(String salt) { 16: this.salt = salt; 17: } 18:
19: public String encode(final String password) {
20: return EncryptUtil.getMD5Str(EncryptUtil.getMD5Str(password) + salt); 21: }
22: 23: }
当中的salt是从数据库中取出来的⼀个盐值,该值会在另⼀个⾃定义的数据库验证类中取到并传递给UCPasswordEncoder,在此不再阐述。
EncryptUtil.getMD5Str(EncryptUtil.getMD5Str(password) + salt),也就是笔者项⽬要使⽤的加密算法(MD5结果+盐值,再MD5加密)。最后修改tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml加密算法的配置:
1:
这样⾃定义加密算法的实现就完成了。
因篇幅问题不能全部显示,请点此查看更多更全内容