CAS单点登录之使用JDBC认证

构建版本基于CAS 5.3.x

CAS认证策略

Cas提供非常的认证策略,不仅仅支持第三方的认证策略,还支持自定义认证策略,我们主要集成的第三方认证如下:

  • LADP 轻量级目录访问协议
  • JAAS Java标准身份验证和授权API
  • Shiro 可以集成Apache Shiro来进行身份认证
  • Basic Authentication 在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。明文传输不安全
  • X.509 一种证书认证,通过TLS/SSL协议中进行公钥私钥匹配方式加密
  • Digest Authentication HTTP摘要访问认证,通过对Web端发送的密码进行Hash,然后再进行传输。在基本认证基础上进行了密码的增强。
  • Rest Rest认证方式,直接发送Rest请求来获取对应状态码(Code),来判别验证状态
  • JDBC 通过访问数据库来查询对应属性,进行身份验证
  • PAC4J 可以与PAC4J框架进行集成
  • 自定义认证策略 可以自定义认证策略

JDBC认证

本文将介绍如何使用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);

插入的四条记录分别对应三种状态:

  • admin 正常登陆
  • lisi和wangwu 账户被禁用
  • zhangsan 密码过期需要更改密码

密码错误
CAS单点登录之使用JDBC认证_第1张图片

验证通过
CAS单点登录之使用JDBC认证_第2张图片
账户锁定
CAS单点登录之使用JDBC认证_第3张图片
账户过期
CAS单点登录之使用JDBC认证_第4张图片

JDBC加密

在正式的生产环境中,我们的密码都不可能进行明文传输的,要么在前端进行加密,要么入库的时候进行加密,这样防止密码数据库被别人窃取。正确的做法一般都是两方面都会进行加密

现在给我们的配置文件追加如下配置信息:

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);

现在使用md5test/123456访问
CAS单点登录之使用JDBC认证_第5张图片

当然还支持扩展的加密方式,通过实现rg.springframework.security.crypto.password.PasswordEncoder扩展加密算法,此时需要配置cas.authn.jdbc.query[0].passwordEncoder.type=你实现类的全限定名.

JDBC加盐加密

只是加密会降低安全性,要想提高安全性,我们一般会选择对密码加盐处理和增加加密次数的处理,这样一方面降低密码的相同的冲突,另一方面降低了破解的难度。

增加配置信息

#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);

访问:
CAS单点登录之使用JDBC认证_第6张图片

你可能感兴趣的:(CAS,CAS)