SSO单点登录教程(八)CAS-搭建CAS Server服务端(
作者:蓝雄威,叩丁狼教育高级讲师。原创文章,转载请注明出处。
一、前言
在上一章节,我们已经把CAS Server搭建好了,但是使用的是静态的认证,即用户名和密码是硬编码在配置文件中的.很显然这种方式并不适合公司里面的开发,公司里面的用户名和密码应该是通过加密的方式存储到数据库中的.
所以接下来这章节讲给同学们讲解一下CAS Server如何使用JDBC方式进行认证.
二、准备工作
我们需要把用户存储到数据库中,脚本文件cas.sql在
https://github.com/javalanxiongwei/cas-overlay-template-master.
1.创建数据库cas,执行cas.sql文件,执行后拥有了用户表sys_user.
说明:
- expired字段表示过期,1表示已过期,需要修改密码
-
disabled表示账号是否禁用,1表示禁用
sys_user表
数据表存放的数据如下图所示:
id | username | password | expired | disabled |
---|---|---|---|---|
1 | admin | 21232f297a57a5a743894a0e4a801fc3 | 0 | 1 |
2 | wolfcode | 71120db8bf616bcf5b913557587435ad | 1 | 0 |
3 | lanxw | fae0b27c451c728867a567e8c1bb4e53 | 0 | 0 |
说明:
如果采用MD5加密,那password就是MD5加密后的密文,sha同样如此
admin、wolfcode、lanxw明文密码分别是admin、wolfcode、666
2.在POM文件中添加如下依赖:
<!--新增支持jdbc验证-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<!--使用mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
三、配置
需要在配置中告诉框架要哪个数据库的哪个表查询数据,所以在application.properties新增如下配置.
#jdbc验证配置
#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.MySQLDialect
#数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库密码
cas.authn.jdbc.query[0].password=admin
#默认加密策略,通过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 数据库查询校验用户名结束
#jdbc验证配置
以上配置,如驱动,查询数据库等等需要根据不同的场景进行调整:
- 若密码无加密,调整passwordEncoder.type=NONE
- 若密码加密策略为SHA,调整passwordEncoder.encodingAlgorithm=SHA
- 若算法为自定义,实现org.springframework.security.crypto.password.PasswordEncoder接口,并且把类名配置在passwordEncoder.type
四、测试
在项目所在目录运行build.cmd run
,在浏览器输入http://www.sso.com:8443/cas/login
.
输入admin/admin
账号被禁用
输入wolfcode/wolfcode
账户过期
输入lanxw/666
正常登陆
五、其他
我们已经把CAS Server端的验证变成使用JDBC的方式认证,而且在数据库中也已经对明文密码使用md5进行加密,但是只是用md5加密安全性不够高.所以一般我们会对密码使用md5+盐加密来增加密码管理的安全性.
我们需要修改application.properties,在配置文件中指定盐值和加密次数:
对应的sys_user_encode的脚本也是从上面的github地址获取.
测试过程和第四点是一致的.
#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:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8
cas.authn.jdbc.encode[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.encode[0].user=root
cas.authn.jdbc.encode[0].password=admin
cas.authn.jdbc.encode[0].driverClass=com.mysql.jdbc.Driver
#Encode Database Authentication 结束
WechatIMG9.jpeg