zoukankan      html  css  js  c++  java
  • CAS 之 Https And Database Authentication(三)

    CAS 之 Https And Database Authentication(三)

    标签(空格分隔): CAS

    sso-examples-guides源码


    Intro(介绍)

    由上节可知Apereo CAS 官方默认使用 https 的方式进行部署:
    为了安全,我们使用https方式,并禁用静态账户信息。

    What you’ll need(需要掌握)

    • JDK 1.8 or later
    • Maven 3.2+
    • spring boot
    • Spring Tool Suite (STS)
    • IntelliJ IDEA
    • keytool

    生成证书

    生成key

    keytool -genkey -alias ssokeystore  -keyalg RSA -keysize 2048 -keypass 123456 -storepass 123456 -keystore D:/sso/sso.keystore -dname "CN=www.galsang.org,OU=galsang.org,O=galsang,L=Shanghai,ST=Shanghai,C=CN" -ext "san=dns:www.galsang.org,ip:192.168.6.53"
    

    导出证书

    keytool -export -file D:/sso/ssokeystore.crt -alias ssokeystore  -keystore D:/sso/sso.keystore  -keypass 123456 -storepass 123456
    # 或
    keytool -exportcert -alias ssokeystore   -keystore D:/sso/sso.keystore -file D:/sso/ssokeystore.crt -keypass 123456 -storepass 123456
    
    

    导入证书到本地JDK(客户端认证)

    keytool -import -alias ssokeystore   -keystore D:/javaspace/Java/jdk1.8.0_131/jre/lib/security/cacerts -file D:/sso/ssokeystore.crt -keypass changeit -storepass changeit
    

    删除证书

    如果之前导入过该别名ssokeystore的证书,则删除证书

    keytool -delete -alias ssokeystore   -keystore D:/javaspace/Java/jdk1.8.0_131/jre/lib/security/cacerts -keypass changeit -storepass changeit
    

    查看密钥库证书

    keytool -list  -keystore D:/javaspace/Java/jdk1.8.0_131/jre/lib/security/cacerts -keypass changeit -storepass changeit
    

    查看指定证书内容

    keytool  -printcert  -file "D:/sso/ssokeystore.crt "
    

    https 配置

    步骤一:将生成的密钥 sso.keystore 拷贝至 src/main/resources 目录下
    步骤二:进行配置
    由于5.2.0版本是默认是开启的,这里先关闭,后期上生产之前再开启并进行配置:
    Ticket Granting Cookie

    cas:
      tgc:
        secure: false  # cas.tgc.secure=true
    

    步骤三:进行application.yml配置
    笔者喜欢使用yml文件的方式进行配置,故将application.properties文件中的配置迁移至application.yml,但依然要保留application.properties文件将原始war中的application.properties文件覆盖,这是因为 maven-war-plugin/overlays的缘故。

    
    spring:
      application:
        name: cas-server
      http:
        encoding:
          enabled: true
          charset: UTF-8
          force: true
      thymeleaf:
        encoding: UTF-8
        cache: true
        mode: HTML
      aop:
        auto: true
        proxy-target-class: true
    
    # CAS Server Context Configuration
    server:
      context-path: /cas
      port: 8443
      max-http-header-size: 2097152
      use-forward-headers: true
      connection-timeout: 20000
      error:
        include-stacktrace: ALWAYS
      compression:
        enabled: true
        mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain
      ssl:
        key-store: classpath:sso.keystore
        key-store-password: 123456
        key-password: 123456
        enabled: true
      tomcat:
        max-http-post-size: 2097152
        basedir: build/tomcat
        max-threads: 10
        port-header: X-Forwarded-Port
        protocol-header: X-Forwarded-Proto
        protocol-header-https-value: https
        remote-ip-header: X-FORWARDED-FOR
        uri-encoding: UTF-8
        accesslog:
          enabled: true
          pattern: "%t %a '%r' %s (%D ms)"
          suffix: .log
      session:
        timeout: 300
        cookie:
          http-only: true
        tracking-modes: COOKIE
      context-parameters:
        isLog4jAutoInitializationDisabled: true
    
    cas:
      server:
        name: https://www.galsang.org:8443
        prefix: https://www.galsang.org:8443/cas
      adminPagesSecurity:
        ip: 127.0.0.1
      authn:
        accept:
          users: casuser::Mellon,admin::adminto # 静态用户信息
    #  webflow:
    #    crypto:
    #      enabled: false   #cas.webflow.crypto.enabled=false
      tgc:
        secure: false  # cas.tgc.secure=true
    
    management:
      security:
        enabled: true
        roles: ACTUATOR,ADMIN
        sessions: if_required
      context-path: /status
      add-application-context-header: false
    
    security:
      basic:
        enabled: false
        authorize-mode: role
        path: /cas/status/**
    
    endpoints:
      enabled: false
      sensitive: true
      restart:
        enabled: false
      shutdown:
        enabled: false
    
    logging:
      config: classpath:log4j2.xml
    
    info:
      description: cas-server
    

    Run(运行)

    进入cas-server模块执行 build run 命令。

    sso-examples-guidescas-server>build run
    

    访问入口: https://127.0.0.1:8443/cas/login

    运行效果

    默认的静态账户信息, 账号:casuser, 密码: Mellon

    使用我自定义的静态账户信息, 账号:admin, 密码: adminto

    至此,系统可以使用https的形式进行访问,那么下面我们来看一下 Database Authentication是如何配置实现的。


    Database Authentication 配置

    步骤一: 禁用静态账户

    # 禁止静态认证
    staticAuthentication: false
    # 将将静态账户信息置空
    cas:
        authn:
            accept:
              users: 
    

    步骤二: 设计数据库

    数据库脚本如下:

    DROP DATABASE IF EXISTS `cas_dev`;
    
    CREATE DATABASE `cas_dev` character Set UTF8;
    
    use `cas_dev`;
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `cas_user`
    -- ----------------------------
    DROP TABLE IF EXISTS `cas_user`;
    CREATE TABLE `cas_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(50) NOT NULL,
      `password` varchar(50) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
    
    -- ----------------------------
    -- Records of cas_user
    -- ----------------------------
    INSERT INTO `cas_user` VALUES ('1', 'admin', '1e1e262780021c6844af137175b56804');
    
    

    步骤三: pom.xml文件里增加依赖

            <!--引入数据库认证相关 start-->
            <dependency>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-support-jdbc</artifactId>
                <version>${cas.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.apache.logging.log4j</groupId>
                        <artifactId>log4j-slf4j-impl</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>com.google.guava</groupId>
                        <artifactId>guava</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>com.zaxxer</groupId>
                        <artifactId>HikariCP</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.driver.version}</version>
            </dependency>
            <!--引入数据库认证相关 end-->
    

    步骤四: 在application.yml中增加相关配置。
    最终application.yml内容为:

    
    spring:
      application:
        name: cas-server
      http:
        encoding:
          enabled: true
          charset: UTF-8
          force: true
      thymeleaf:
        encoding: UTF-8
        cache: true
        mode: HTML
      aop:
        auto: true
        proxy-target-class: true
    
    # CAS Server Context Configuration
    server:
      context-path: /cas
      port: 8443
      max-http-header-size: 2097152
      use-forward-headers: true
      connection-timeout: 20000
      error:
        include-stacktrace: ALWAYS
      compression:
        enabled: true
        mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain
      ssl:
        key-store: classpath:sso.keystore
        key-store-password: 123456
        key-password: 123456
        enabled: true
      tomcat:
        max-http-post-size: 2097152
        basedir: build/tomcat
        max-threads: 10
        port-header: X-Forwarded-Port
        protocol-header: X-Forwarded-Proto
        protocol-header-https-value: https
        remote-ip-header: X-FORWARDED-FOR
        uri-encoding: UTF-8
        accesslog:
          enabled: true
          pattern: "%t %a '%r' %s (%D ms)"
          suffix: .log
      session:
        timeout: 300
        cookie:
          http-only: true
        tracking-modes: COOKIE
      context-parameters:
        isLog4jAutoInitializationDisabled: true
    
    cas:
      server:
        name: https://www.galsang.org:8443
        prefix: https://www.galsang.org:8443/cas
      adminPagesSecurity:
        ip: 127.0.0.1
      tgc:
        secure: false  # cas.tgc.secure=true
      authn:
        accept:
          users:   # 静态用户信息 casuser::Mellon,admin::adminto
        jdbc:
          query[0]:
            sql: select * from cas_user where username=?
            healthQuery: select 1
            isolateInternalQueries: false
            # 指定时区 serverTimezone=Asia/Shanghai
            url: jdbc:mysql://127.0.0.1:3306/cas_dev?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
            failFast: true
            isolationLevelName: ISOLATION_READ_COMMITTED
            dialect: org.hibernate.dialect.MySQLDialect
            leakThreshold: 10
            propagationBehaviorName: PROPAGATION_REQUIRED
            batchSize: 1
            user: root
            password: adminto
            autocommit: false
            maxAgeDays: 180
            driverClass: com.mysql.cj.jdbc.Driver
            idleTimeout: 5000
            fieldPassword: password
            passwordEncoder:
              type: DEFAULT
              characterEncoding: UTF-8
              encodingAlgorithm: MD5
    
    staticAuthentication: false
    
    management:
      security:
        enabled: true
        roles: ACTUATOR,ADMIN
        sessions: if_required
      context-path: /status
      add-application-context-header: false
    
    security:
      basic:
        enabled: false
        authorize-mode: role
        path: /cas/status/**
    
    endpoints:
      enabled: false
      sensitive: true
      restart:
        enabled: false
      shutdown:
        enabled: false
    
    logging:
      config: classpath:log4j2.xml
    
    info:
      description: cas-server
      
    

    Run(运行)

    进入cas-server模块执行 build run 命令。

    sso-examples-guidescas-server>build run
    

    访问入口: https://127.0.0.1:8443/cas/login

    使用数据库中默认的账户信息, 账号:admin, 密码: adminto

    密码修改可以在src/test/java 目录下的 PasswordByMD5Main类进行重置密码,并更新到数据库即可。

    至此,系统可以使用https的形式进行访问,并通过 Database Authentication进行用户认证。

    Conclusions(结论)

    • Database Authentication 使用的是JPA方式,数据库连接池使用的是HikariCP
    • JPA是默认的 Database Authentication 方式,那么在后面的文章中将说明如何替换JPA

    Recommendations(建议)

    • 使用https
    • 禁用静态账户
    • 工程复杂,一定要注意版本之间的关系,开源项目,最好对照源码编译版本进行部署。

    原创声明

    作者:随风浮云
    出处:http://www.cnblogs.com/ljmatlight
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明。
    文中有不妥或者错误的地方,欢迎勘误,如果你有更好的建议,可以给我留言讨论,共同进步。
    互联网技术时效性较强,引用请慎重。


  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/ljmatlight/p/8663638.html
Copyright © 2011-2022 走看看