pandaAnthony:spring boot cas 服务端

2018-08-30  本文已影响0人  pandaAnthony

这个系列有3篇文章:

  1. spring boot cas 服务端和spring security客户端搭建(一):主要介绍怎么用spring boot cas搭建https的服务端
  2. spring boot cas 服务端和spring security客户端搭建(二):主要介绍怎么用怎么结合数据库用cas提供的动态加密方式登录及相关配置
  3. 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方式的验证。

上一篇下一篇

猜你喜欢

热点阅读