pandaAnthony:spring boot cas 服务端
这个系列有3篇文章:
- spring boot cas 服务端和spring security客户端搭建(一):主要介绍怎么用spring boot cas搭建https的服务端
- spring boot cas 服务端和spring security客户端搭建(二):主要介绍怎么用怎么结合数据库用cas提供的动态加密方式登录及相关配置
- spring boot cas 服务端和spring security客户端搭建(三):主要介绍怎么结合spring security客户端进行整合及http方式登录配置
接着上篇spring boot cas 服务端和spring security客户端搭建(一)继续介绍服务端的搭建。上文已经搭建好了默认的基于https和静态用户的CAS服务端,实际中不会有项目那么处理的,需要连接数据库或者其他形式来进行用户认证;
所有配置的内容可以参考https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html。
这里主要介绍连接数据库的方式。搜索‘Database Authentication’可以找到相关的内容:
可以发现DataBase Authentication分为Query Database Authentication,Search Database Authentication,Bind Database Authentication,Encode Database Authentication。
这里主要介绍下Encode Database Authentication,加密数据库验证。
image.png
所有的都是以cas.authn.jdbc.encode[0]为前缀,其中
sql表示需要查询的用户表以及登录时用户名对应的列名
passwordFiledName表示对应密码的列名
expiredFiledName表示对应失效的列名
disableFieldName表示对应禁止的列名
driverClass, dialect, url, user, password都是数据库相关的连接信息这里就不过多描述了
numberOfIterations表示加密迭代次数
numberOfIterationsFieldName表示对应的加密迭代次数的列名
saltFieldName表示用哪列作为动态的盐值
staticSalt表示静态的盐值
algorithmName表示加密算法
这里的加密方式是CAS提供的,我们看下具体是怎么验证的。在IDE中打开encode 验证的核心类QueryAndEncodeDatabaseAuthenticationHandler,找到对应的验证方法:
image.png
可以看到加密的核心方法就在digestEncodedPassword中处理的:
image.png
我们在保存密码时需要按照通用的逻辑把上面的代码抽出来,才能保证存到数据库的密码和CAS配置的加盐验证一致。以下代码仅供参考:
/**
* cas加密工具类,参照QueryAndEncodeDatabaseAuthenticationHandler中的digestEncodedPassword实现
* @param encodedPass
* @param dynaSalt
* @param staticSalt
* @param algorithmName
* @param numberOfIterations
* @return
*/
public static String digestEncodedPassword (String encodedPass, String dynaSalt, String staticSalt, String algorithmName, Long numberOfIterations) {
ConfigurableHashService hashService = new DefaultHashService();
if (StringUtils.isNoneBlank(staticSalt)) {
hashService.setPrivateSalt(ByteSource.Util.bytes(staticSalt));
}
hashService.setHashAlgorithmName("MD5");
hashService.setHashIterations(numberOfIterations.intValue());
final HashRequest request = new HashRequest.Builder()
.setSalt(dynaSalt)
.setSource(encodedPass)
.build();
return hashService.computeHash(request).toHex();
}
当然仅仅上面的配置是无法实现数据库连接的,我们需要在工程的pom文件中添加数据库包及CAS依赖才可以实现加密的数据库连接认证:
image.png
image.png
具体的数据库包根据具体使用的来定,jdbc认证需要添加cas的依赖包(版本和cas版本保持一致):
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
到这里基于CAS的数据库加密验证就结束了。其他验证方式请参考官方文档,我这边也只测试过基础的query方式,配置如下:
image.png
除去加密部分,数据库连接相关的和encode的没什么太大差异,只是前缀变成了cas.authn.jdbc.query[0],和encode相比就是encode变成了query。
其实看下源码可以发现所有的数据库验证方式都在同一个包中,具体的验证参考具体的类和方法即可:
image.png
CAS服务的数据库连接的相关配置就到这了。下篇描述下怎么和spring boot security的客户端集成,以及CAS服务端http方式的验证。