构建版本基于CAS 5.3.x
Cas提供非常的认证策略,不仅仅支持第三方的认证策略,还支持自定义认证策略,我们主要集成的第三方认证如下:
基本认证
基础上进行了密码的增强。Code
),来判别验证状态本文将介绍如何使用JDBC进行认证
cas 根据登录用户名去数据库查询对应的记录,然后通过配置文件设置的字段来进行身份标识的认证的验证
在Cas中进行查询认证的属性主要是QueryJdbcAuthenticationProperties
这个对象,它主要包含如下的几个属性:
属性名 | 类型 | 作用 |
---|---|---|
sql | String | 认证时需要执行查询语句 |
fieldPassword | String | 匹配记录的密码字段(必填) |
fieldExpired | String | 过期表示对应的字段 |
fieldDisabled | String | 禁用标识对应的字段 |
credentialCriteria | String | 自定义的认证处理程序,可以是正则表达式,也可以是自己自定义类的全限定名 |
下面我们将使用最简单的认证来举?
重新下载一个模版工程:参考 ☞☞ 基础构建
创建表结构
CREATE TABLE SYS_USER (
USERNAME VARCHAR(20) PRIMARY KEY,
PASSWORD VARCHAR(64) NOT NULL,
EXPIRED INT,
DISABLED INT
);
更改配置文件
# 关闭静态认证
server.ssl.enabled=false
staticAuthentication=false
#用户登录时查询语句
cas.authn.jdbc.query[0].sql=select * from SYS_USER where username=?
#匹配的属性列
cas.authn.jdbc.query[0].fieldPassword=password
#指定过期字段 int 类型 1为过期 0 为不过期
cas.authn.jdbc.query[0].fieldExpired=expired
#指定过期字段 int 类型 1为不可用 0为可用
cas.authn.jdbc.query[0].fieldDisabled=disabled
#指定数据库方言
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQL57Dialect
#数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#数据库链接地址
cas.authn.jdbc.query[0].url=jdbc:mysql://http://106.14.0.100/cas?useSSL=false&useUnicode=true&characterEncoding=utf-8
#帐号
cas.authn.jdbc.query[0].user=root
#密码
cas.authn.jdbc.query[0].password=123456
QueryJdbcAuthenticationProperties
对象是继承AbstractJpaProperties
属性对象的,所以它可以拥有数据库的连接属性。在这里我们还是要关闭SSL
,因为我们现在不需要加密连接,而且需要配置加密证书比较麻烦,我们后期需要的时候再导入证书,开启SSL
即可。
sql对应我们需要查询的记录,然后通过对结果集的字段进行映射匹配,从而知道我们的账户对应什么状态。
INSERT INTO `SYS_USER` VALUES ('admin', '123456', 0, 0);
INSERT INTO `SYS_USER` VALUES ('lisi', '123456', 0, 1);
INSERT INTO `SYS_USER` VALUES ('wangwu', '123456', 1, 1);
INSERT INTO `SYS_USER` VALUES ('zhangsan', '123456', 1, 0);
插入的四条记录分别对应三种状态:
在正式的生产环境中,我们的密码都不可能进行明文传输的,要么在前端进行加密,要么入库的时候进行加密,这样防止密码数据库被别人窃取。正确的做法一般都是两方面都会进行加密
现在给我们的配置文件追加如下配置信息:
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
QueryJdbcAuthenticationProperties
中有一个加密的对象PasswordEncoderProperties
,主要支持如下几种加密方式:
NONE
不加密(默认的)DEFAULT
使用encodingAlgorithm来定义加密方式(MD5,SHA)STANDARD
标准加密,使用1024的SHA-256散列迭代和随机8字节随机盐值进行加密。BCRYPT
使用BCryptPasswordEncoder
方法加密SCRYPT
使用SCryptPasswordEncoder
方法加密PBKDF2
使用Pbkdf2PasswordEncoder
方法加密现在我们我们插入一条记录
INSERT INTO SYS_USER VALUES ('md5test', 'e10adc3949ba59abbe56e057f20f883e', 0, 0);
当然还支持扩展的加密方式,通过实现rg.springframework.security.crypto.password.PasswordEncoder
扩展加密算法,此时需要配置cas.authn.jdbc.query[0].passwordEncoder.type=
你实现类的全限定名.
只是加密会降低安全性,要想提高安全性,我们一般会选择对密码加盐处理和增加加密次数的处理,这样一方面降低密码的相同的冲突,另一方面降低了破解的难度。
增加配置信息
#Encode Database Authentication 开始
#加密次数
cas.authn.jdbc.encode[0].numberOfIterations=2
#该列名的值可替代上面的值,但对密码加密时必须取该值进行处理
cas.authn.jdbc.encode[0].numberOfIterationsFieldName=
# 盐值固定列
cas.authn.jdbc.encode[0].saltFieldName=username
#静态盐值
cas.authn.jdbc.encode[0].staticSalt=.
cas.authn.jdbc.encode[0].sql=select * from sys_user_encode where username=?
#对处理盐值后的算法
cas.authn.jdbc.encode[0].algorithmName=MD5
cas.authn.jdbc.encode[0].passwordFieldName=password
cas.authn.jdbc.encode[0].expiredFieldName=expired
cas.authn.jdbc.encode[0].disabledFieldName=disabled
cas.authn.jdbc.encode[0].url=jdbc:hsqldb:mem:cas-hsql-database
cas.authn.jdbc.encode[0].dialect=org.hibernate.dialect.HSQLDialect
cas.authn.jdbc.encode[0].user=sa
cas.authn.jdbc.encode[0].password=
cas.authn.jdbc.encode[0].driverClass=org.hsqldb.jdbcDriver
现在我们插入一条记录:
INSERT INTO SYS_USER_ENCODE VALUES ('haloo', '189e92cec0682ef2619613c500bf45af', 0, 0);