CAS单点登录-自定义认证之JDBC(五)
注意:单点登录版本为cas-5.1.3
若需要上个版本代码,可以点击下载:
本章节的内容为JDBC认证,查找数据库进行验证,其中包括:
- 密码加密策略(无密码,简单加密,加盐处理)
- 认证策略(jdbc)
业务需求
在不同公司,可能有很多业务需求或者架构不一样导致我们实现验证的方式不一样,那么cas为我们提供了很多认证的模式(当然也可以自定义),其中常用的有:
- JDBC认证
- LDAP认证
- Basic认证
- Shiro认证
- Pac4j认证
- MongoDB认证
- Rest认证
- IP黑白名单
还有可能交给第三方认证,例如:微信、QQ、新浪等等
当然也有一些公司或者企业也非常的变态,如:
- 认证中心不能直接访问账号库,cas也提供功能,可以考虑用REST认证模块来处理这个事情
- 老系统账号唯一性不确定,例如 组织+账号 才是唯一值,这时候只能自定义认证器(后面章节会有教程)
- 业务系统要求返回用户密码(多属性返回/ClearPass)
加密方案
cas支持jdbc校验方案:
- 根据sql给予用户名进行查询,根据密码字段进行鉴定(
select * from table_users where username=?
)可判断有效等 - 通过盐等手段进行编码加密再进行匹配(推荐)
- 根据sql给予用户名以及密码进行查询(
select count(x) from tables_users where username = ? and password=?
),不可判断有效期,若数量大于0则成功 - 根据用户名密码连接数据库,原理是通过jdbc,若连接成功则成功
下文会讲述前两种的配置方法
常用单向加密算法:MD5、SHA、HMAC
一般的加密策略的三种:
- 单项加密算法(密码)
- 单向加密算法(密码+动态盐+私有盐)*加密次数(推荐)
- 不加密(不推荐)
上述提到的加密方案策略,下面都会一一说明白
JDBC验证
采用HSQLDB-2.4.0数据库存储用户数据。
修改pom.xml
sso-server/pom.xml:
<!--新增支持jdbc验证-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<!-- hsqldb驱动
根据不同的数据库使用不同驱动
-->
<dependency
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.4</version>
</dependency>
<!--
若不想找驱动可以直接写下面的依赖即可,其中包括
HSQLDB、Oracle、MYSQL、PostgreSQL、MariaDB、Microsoft SQL Server
-->
<!--
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
-->
表结构
sys_user:
字段名 | 字段类型 | 备注 |
---|---|---|
username | varchar | 登录账号 |
password | varchar | 密码 |
expired | int | 过期字段,1为过期,需修改密码 |
disable | int | 不可用字段,1为不可用,禁用 |
varchar | 邮箱,可不需要 |
CAS Authentication Credentials
根据sql给予用户名进行查询,根据密码字段进行鉴定(
select * from table_users where username=?
)
程序新增配置
#Query Database Authentication 数据库查询校验用户名开始
#查询账号密码sql,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from sys_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
#数据库方言hibernate的知识
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.HSQLDialect
#数据库驱动
cas.authn.jdbc.query[0].driverClass=org.hsqldb.jdbcDriver
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:hsqldb:mem:cas-hsql-database
#数据库用户名
cas.authn.jdbc.query[0].user=sa
#数据库密码
cas.authn.jdbc.query[0].password=
#默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密
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
#Query Database Authentication 数据库查询校验用户名结束
以上配置,如驱动,查询数据库等等需要根据不同的场景进行调整
- 若密码无加密,调整
passwordEncoder.type=NONE
- 若密码加密策略为SHA,调整
passwordEncoder.encodingAlgorithm=SHA
- 若算法为自定义,实现
org.springframework.security.crypto.password.PasswordEncoder
接口,并且把类名配置在passwordEncoder.type
执行流程(如输入账号密码为 admin/123):
Encode Database Authentication 编码加密
对密码进行盐值处理再加密,增加了反查难度,如上面的例子,对密码只是简单的加密,不同的帐号有可能相同的值,能判断出密码是一致,但通过此方案,大大增加了难度,所以安全系数也高了许多,推荐策略
#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
#Encode Database Authentication 结束
根据CAS Authentication Credentials的配置相差不大,主要是对加密的策略进行调整,涉及到部分字段的配置,其他均一致
登录帐号
用户名 | 密码 | 是否可登录 | 备注 |
---|---|---|---|
admin | 123 | √ | |
zhangsan | 12345678 | √ | |
zhaosi | 1234 | × | 禁用 |
wangwu | 12345 | √ | 需修改密码 |
当然了修改密码又是另外一个话题,但是cas也提供了密码管理的功能,后续的章节我们也会进行讲解。
自定义认证计划
- Shiro 认证(下一章节)
- Pac4j 认证(下一章节)
- Rest认证(待客户端对接完成后)
- 自定义认证器(待客户端对接完成后)
若其他认证方式有需要请联系小编进行交流
作者联系方式
如果技术的交流或者疑问可以联系或者提出issue。
邮箱:huang.wenbin@foxmail.com
QQ: 756884434 (请注明:SSO-CSDN)