今天我们讲解一下CAS的认证方式,有JDBC认证、白名单(Whitelist)认证、黑名单(Blacklist)认证、Shiro认证、Rest认证。
目前只针对JDBC认证讲解,更多抽时间更新。
1、JDBC认证
在前面我们设计了一个user表,表的字段为:
常用单向加密算法:MD5、SHA、HMAC。
一般我们常用的加密算法就这几种。在JDBC认证中我们也可以选择配置加密算法,加密算法一般为上面的三种,MD5、SHA、HMAC,加密类型为NONE|DEFAULT|STANDARD|BCRYPT|SCRYPT|PBKDF2这几种,我们在配置文件中选择加密类型,指定加密算法。
前面配置不变指定JDBC配置,后面的配置为密码加密策略,配置如下:
## # JDBC配置 # #查询账号密码SQL,必须包含密码字段 cas.authn.jdbc.query[0].sql=select * from user where username=? #指定上面的SQL查询字段名(必须) cas.authn.jdbc.query[0].fieldPassword=password #指定过期字段,1为过期,若过期不可用 cas.authn.jdbc.query[0].fieldExpired=expired #为不可用字段段,1为不可用,需要修改密码 cas.authn.jdbc.query[0].fieldDisabled=disabled #数据库连接 cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false #数据库dialect配置 cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect #数据库用户名 cas.authn.jdbc.query[0].user=root #数据库用户密码 cas.authn.jdbc.query[0].password=123 #数据库事务自动提交 cas.authn.jdbc.query[0].autocommit=false #数据库驱动 cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver #超时配置 cas.authn.jdbc.query[0].idleTimeout=5000 #默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密 # NONE|DEFAULT|STANDARD|BCRYPT|SCRYPT|PBKDF2 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT # 字符类型 cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 # 加密算法 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5 # 加密盐 #cas.authn.jdbc.query[0].passwordEncoder.secret= # 加密字符长度 #cas.authn.jdbc.query[0].passwordEncoder.strength=16
然后我们启动应用。当我们运行起CAS,输入原来的用户名和密码——admin/123456,并不能登录,因为我们更改密码验证为MD5加密模式了。将123456使用md5加密后,填入数据库,再次登录,可以发现登录成功。由此验证我们加密成功!
接着我们再新增用户tongyao、zhangsan,密码分别为用户名md5加密,而tongyao的expired为1。如下:
因此当我们登录tongyao、zhangsan用户时,将会有需要更改密码和禁用提示。
除此之外如果我们要自定义加密类型,就需要实现org.springframework.security.crypto.password.PasswordEncoder接口,并且把类名配置在passwordEncoder.type。
这里配置为自定义加密,新建类MyPasswordEncoder。
package com.example.demo; import org.springframework.security.crypto.password.PasswordEncoder; /** * @author tongyao */ public class MyPasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence charSequence) { // charSequence为输入的用户密码 return charSequence.toString(); } @Override public boolean matches(CharSequence charSequence, String str) { // 当encode方法返回不为null时,matches方法才会调用,charSequence为encode返回的字符串 // str字符串为数据库中密码字段返回的值 String encodeStr = charSequence.toString() + "aa"; if (encodeStr.equals(str)) { return true; } return false; } }
更改配置为:
cas.authn.jdbc.query[0].passwordEncoder.type=com.example.demo.MyPasswordEncoder
更改tongyao用户密码为11aa,启动应用,根据加密算法只要我们登录输入密码11即可验证成功。
如果要密码无加密,调整passwordEncoder.type=NONE。
如果要加密策略为SHA,调整passwordEncoder.encodingAlgorithm=SHA。
到此JDBC的认证方式我们就讲解完毕了,关于更多的使用参考文档:
密码加密配置: