美文网首页
pandaAnthony:spring boot cas 服务端

pandaAnthony:spring boot cas 服务端

作者: pandaAnthony | 来源:发表于2018-08-30 22:23 被阅读0次

    这个系列有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方式的验证。

    相关文章

      网友评论

          本文标题:pandaAnthony:spring boot cas 服务端

          本文链接:https://www.haomeiwen.com/subject/hibdwftx.html