Springboot簡單功能示例-6 使用加密資料來源並配置日誌

超級修理工發表於2023-09-26

springboot-sample

介紹

springboot簡單示例 跳轉到發行版 檢視發行版說明

軟體架構(當前發行版使用)

  1. springboot
  2. hutool-all 非常好的常用java工具庫 官網 maven
  3. bcprov-jdk18on 一些加密演算法的實現 官網 maven
  4. h2 純java的資料庫,支援記憶體、檔案、網路資料庫 官網 maven

安裝教程

git clone --branch 6.使用加密資料來源並配置日誌 git@gitee.com:simen_net/springboot-sample.git
 

功能說明

  1. 配置logback
  2. 配置了資料來源,對資料庫賬號密碼進行加密
  3. 增加了系統啟動配置

發行版說明

  1. 完成基本WEB服務 跳轉到發行版
  2. 完成了KEY初始化功能和全域性錯誤處理 跳轉到發行版
  3. 完成了基本登入驗證 跳轉到發行版
  4. 完成了自定義加密進行登入驗證 跳轉到發行版
  5. 完成了使用JWT進行授權認證 跳轉到發行版
  6. 完成了使用加密資料來源並配置日誌 跳轉到發行版 檢視發行版說明

使用加密資料來源並配置日誌

配置logback

配置logback.xml,規範日誌輸出格式,配置info和error日誌輸出為檔案(儲存30天)

配置資料來源

  1. application-dev.yaml中配置資料來源

    # spring基本配置
    spring:
      # 資料庫連線池配置
      datasource:
        driver-class-name: org.h2.Driver
        # 使用H2資料庫,此處不配置url,在com.strong.config.DataSourceConfig中配置本地目錄資料庫
        # url: jdbc:h2:mem:simen
        # url: jdbc:h2:./simen
        username: BKkV4rITSiMsMBEZtIoNeLivkfJYjRNPJjX0EJ21hxMQ/oflQL5Qk3u8B7RhqfD+KIkOkPHDSNx3c67q78lTwLqTOCuYkltDI2R9kES3d4yXb+bFxtXAm9qs7m+EMLX85MRX
        password: BDNZEUz2C0XDhU0y3OtKUCVkoLKVlTo5EXEIhBtKHwAGT5heBYyKkkd0I5J8A1PBRGkczhA86MqI2SQTXXuJ+b+ki4jqhlNhELG+ts6T/VZugd6pKs5bbqcSDWqT5s0XEpbgJ1Ah7aE56AbazjVaBX5U3FsEU/KhWHQ3qx0KoN47
        # 連線池型別
        type: com.alibaba.druid.pool.DruidDataSource
        # 引數配置
        druid:
          # 初始化時建立物理連線的個數
          initialSize: 5
          # 最小連線池數量
          minIdle: 20
          # 最大連線池數量
          maxActive: 50
          # 獲取連線時最大等待時間,單位:毫秒
          maxWait: 60000
    
          # 是否快取PSCache,PSCache對支援遊標的資料庫效能提升巨大
          poolPreparedStatements: true
          # 啟用PSCache,必須配置大於0
          maxPoolPreparedStatementPerConnectionSize: 20
    
          # 用來檢測連線是否有效的sql
          validationQuery: select 1
          # 檢測連線是否有效的超時時間,單位:秒
          validationQueryTimeout: 5
          # 申請連線時執行validationQuery檢測連線是否有效,會降低效能
          testOnBorrow: false
          # 歸還連線時執行validationQuery檢測連線是否有效,會降低效能
          testOnReturn: false
          # 申請連線的時候檢測連線是否有效
          testWhileIdle: true
    
          # 空閒時間超過minEvictableIdleTimeMillis,是否強制keepAlive
          keepAlive: false
          # 空閒時間大於等於minEvictableIdleTimeMillis則關閉物理連線,單位是毫秒
          timeBetweenEvictionRunsMillis: 60000
          # 連線保持空閒而不被驅逐的最小時間,單位毫秒
          minEvictableIdleTimeMillis: 30000
    
          # 物理連線初始化的時候執行的sql。
          connectionInitSqls: select 0
    
          # 常用的外掛有:監控統計用的filter:stat、日誌用的filter:log4j、防禦sql注入的filter:wall
          filters: stat,wall,slf4j
    
          # 透過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
          connectionProperties: |-
            druid.stat.mergeSql=false;
            druid.stat.slowSqlMillis=5000
     
  2. 增加資料庫配置DataSourceConfig,對賬號密碼進行加密,解決專案原始碼提交到公共git造成賬號密碼洩露的問題。

    /**
     * 從預設引數配置資料來源
     *
     * @return {@link DataSource}
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DataSource getDataSource() {
        DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build();
        // 如果是H2資料庫,則注入載入
        if (StrUtil.equals(org.h2.Driver.class.getName(), driverClassName)) {
            // 配置資料庫URL
            String strJdbcUrl = "jdbc:h2:tcp://localhost:9092/" +
                    StrongUtils.getStaticPath(STR_DIRECTORY_STATICS, databaseName);
            druidDataSource.setUrl(strJdbcUrl);
            log.info("成功連線H2資料庫[{}]", strJdbcUrl);
        }
        // 使用私鑰解密賬號密碼,注入資料來源
        druidDataSource.setUsername(SM2_OBJ.decryptStr(username, KeyType.PrivateKey));
        druidDataSource.setPassword(SM2_OBJ.decryptStr(password, KeyType.PrivateKey));
        return druidDataSource;
    }
     
    • 使用DruidDataSource從application-dev.yaml中載入資料來源配置引數DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build();
    • 在使用H2資料庫時,使用專案名為資料庫名,資料庫檔案儲存在當前專案所在目錄中的static
    • application-dev.yaml中讀取加密後的資料庫賬號密碼,使用私鑰解密後注入資料來源

系統啟動配置

  1. SpringbootSampleApplication.java中配置啟動
    public static void main(String[] args) {
        // 測試加解密、簽名字串
        SecurityUtils.testPasswordEncode();
    
        // 生成資料密碼加密後字串
        String strDatabaseUsername = "sa";
        String strDatabasePassword = "123456";
        log.info("\n使用公鑰加密資料庫賬號密碼,需將加密字串配置到application.yaml\n資料庫使用者名稱[{}] 加密後[{}]\n密碼[{}] 加密後[{}]\n",
                strDatabaseUsername, SM2_OBJ.encryptBase64(strDatabaseUsername, KeyType.PublicKey),
                strDatabasePassword, SM2_OBJ.encryptBase64(strDatabasePassword, KeyType.PublicKey)
        );
    
        // 啟動H2伺服器
        H2Utils.startH2Server();
        // 設定當前時區
        TimeZone.setDefault(TimeZone.getTimeZone(STR_TIME_ZONE_ASIA_SHANGHAI));
        // 獲取系統物件
        SpringApplication application = new SpringApplication(SpringbootSampleApplication.class);
        // 系統pid記錄檔案
        String strPidFile = StrongUtils.getStaticPath(STR_FILE_APP_PID);
        // 將pid監聽資訊寫入記錄檔案,使用 cat /xxxx/app.id | xargs kill 停止服務
        application.addListeners(new ApplicationPidFileWriter(strPidFile));
        log.info("將pid監聽資訊寫入記錄檔案{}", strPidFile);
        // 啟動系統
        application.run();
    }

     

相關文章