SSO单点登录教程(八)CAS-搭建CAS Server服务端(JDBC认证)

作者:蓝雄威,叩丁狼教育高级讲师。原创文章,转载请注明出处。

一、前言

在上一章节,我们已经把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表示禁用

    《SSO单点登录教程(八)CAS-搭建CAS Server服务端(JDBC认证)》 sys_user表

    数据表存放的数据如下图所示:

idusernamepasswordexpireddisabled
1admin21232f297a57a5a743894a0e4a801fc301
2wolfcode71120db8bf616bcf5b913557587435ad10
3lanxwfae0b27c451c728867a567e8c1bb4e5300

说明:
如果采用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

《SSO单点登录教程(八)CAS-搭建CAS Server服务端(JDBC认证)》 账号被禁用

输入wolfcode/wolfcode

《SSO单点登录教程(八)CAS-搭建CAS Server服务端(JDBC认证)》 账户过期

输入lanxw/666

《SSO单点登录教程(八)CAS-搭建CAS Server服务端(JDBC认证)》 正常登陆

五、其他

我们已经把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 结束

《SSO单点登录教程(八)CAS-搭建CAS Server服务端(JDBC认证)》 WechatIMG9.jpeg

    原文作者:叩丁狼教育
    原文地址: https://www.jianshu.com/p/1e46435ffafa
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞