我開源了團隊內部基於SpringBoot Web快速開發的API腳手架v1.6.0更新

2023-07-26 12:03:39

什麼是 rest-api-spring-boot-starter

rest-api-spring-boot-starter 適用於SpringBoot Web API 快速構建讓開發人員快速構建統一規範的業務RestFull API 不在去關心一些繁瑣。重複工作,而是把重點聚焦到業務。

動機

每次Web API常用功能都需要重新寫一遍。或者複製之前的專案程式碼。於是我封裝了這麼一個stater

抽出SpringBoot Web API 每個專案必備需要重複寫的模組,和必備功能。
並且擴充套件了我工作中用到的 所有工具庫。 解放雙手提高開發效率

推薦版本

  • SpringBoot
SpringBoot 2.7.x

版本更新

目前最新版本1.6.2 支援功能如下:

  • 支援一鍵設定自定義RestFull API 統一格式返回

  • 支援RestFull API 錯誤國際化

  • 支援全域性例外處理,全域性引數驗證處理

  • 業務錯誤斷言工具封裝,遵循錯誤優先返回原則

  • 封裝Redis key,value 操作工具類。統一key管理 spring cache快取實現

  • RestTemplate 封裝 POST,GET 請求工具

  • 紀錄檔整合。自定義紀錄檔路徑,按照紀錄檔等級分類,支援壓縮和檔案大小分割。按時間顯示

  • 工具庫整合 整合了lombok,hutool,commons-lang3,guava。不需要自己單個引入

  • 整合mybatisPlus一鍵程式碼生成

  • 紀錄檔記錄,服務監控,支援紀錄檔鏈路查詢。自定義資料來源

  • OpenApi3檔案整合支援一鍵設定。支援多種檔案和自動設定

  • 生成JWT標準Token和許可權認證

  • 介面限流,Ip城市回顯

  • HttpUserAgent請求裝置工具封裝

  • RequestUtil引數解析封裝工具

  • GitHub 地址

  • gitee 地址

Web JWT Token 許可權支援

JWT Web Token

可以輕鬆自定義生成自己JWT Web Token.和基於JWT 的userJwtToken

通過userJwtToken你可以輕鬆生成基於使用者登入認證的Token

@Autowired
private UserJwtToken userJwtToken;
@GetMapping("/login")
public Result login() {
    UserEntry userEntry = new UserEntry();
    userEntry.setUserId("2");
    userEntry.setUsername("billy");
    userEntry.setHobby("eat");
    userJwtToken.rememberMe=true;
    String token = userJwtToken.createdToken(userEntry.getUserId(), userEntry.getUsername(), userEntry);
    return Result.buildSuccess(token);
}

解析token獲取使用者資訊

@GetMapping("/user")
public Result getUser() {
    String token = "eyJhbGciOiJIUzI1NiIsInppcCI6IkRFRiJ9.eNqqViouTVKyUkrKzMmpVNJRyiwuBvKMgKyskkwoK7WiQMnK0MzC0tTUwsDEWEeptDi1SMmqGkx7pkBVgTh5ibmpSIZl5CclVQL5qYklSrW1AAAAAP__.8nWRs40LbRTIQBhJ8jVaANPcvsmX0zoLR66R-b2Uc4M";
    String userName=userJwtToken.getUserName(token);
    String userId= userJwtToken.getUserId(token);
    UserEntry userEntry=userJwtToken.parseUserToken(token,UserEntry.class);
    return Result.buildSuccess(userId);
}

自定義Token祕鑰和簽名設定

jwt:
  secret: 123456   # 祕鑰 建議加密後祕鑰如md5 不要使用明文長度大於6位
  expiration: 86400 # token 過期時間(單位秒 1天后過期)
  token-header: Token  #header token 名稱
  remember-me-expiration: 604800  #記住我 token過期時間(單位秒 7天后過期)
  user-sign: true # 是否自定義簽名。為true需要實現加密介面。和 設定 jwtCfg注入對應bean

自定義簽名認證和動態祕鑰授權需要實現UserSign介面設定UserJwtConfig設定類注入自定義簽名bean

package cn.soboys.superaide.config;

import cn.soboys.restapispringbootstarter.authorization.UserSign;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * @author 公眾號 程式設計師三時
 * @version 1.0
 * @date 2023/7/16 00:20
 * @webSite https://github.com/coder-amiao
 */
public class MyUserSign implements UserSign {

    @Override
    public SignatureAlgorithm sign() {
        return SignatureAlgorithm.HS256;
    }

    @Override
    public String AuthKey() {
        return null;
    }
}

AuthKey返回null時候會使用你在屬性檔案設定的祕鑰。沒有會使用預設的

package cn.soboys.superaide.config;

import cn.soboys.restapispringbootstarter.authorization.*;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @author 公眾號 程式設計師三時
 * @version 1.0
 * @date 2023/7/15 09:49
 * @webSite https://github.com/coder-amiao
 * 使用者jwt token生成設定
 */
@Configuration
public class UserJwtConfig {


    @Bean
    public UserSign MyUserSign() {
        return new MyUserSign();
    }


    @Bean
    public UserJwtToken userJwtToken(UserSign MyUserSign) {
        UserJwtToken userJwtToken = new UserJwtToken();
        userJwtToken.setUserSign(MyUserSign);
        return userJwtToken;
    }
}

許可權認證

基於JWT Web Token 也幫你封裝了許可權登入認證。 你只需要在屬性檔案設定開啟即可。

jwt:
 authorization:
    has-authorization: true
    includes-url: /user    # 需要認證請求 多個用逗號隔開
    excludes-url: /login,/register/**      # 設定無需認證的

全域性幫你自動處理Token過期異常。和錯誤異常你只需要在heard中設定你自己的Token就行

{
    "success": false,
    "code": "401",
    "msg": "未授權 ",
    "requestId": "9a3ytEtOX0UuojSaA2LD",
    "timestamp": "2023-07-17 17:08:05",
    "data": null
}

如果需要自定義自己認證授權邏輯,實現LoginAuthorization介面即可
並且在UserJwtConfig設定類中注入對應LoginAuthorization bean

如:

package cn.soboys.superaide.config;

import cn.soboys.restapispringbootstarter.Assert;
import cn.soboys.restapispringbootstarter.HttpStatus;
import cn.soboys.restapispringbootstarter.authorization.LoginAuthorization;
import cn.soboys.restapispringbootstarter.authorization.UserJwtToken;
import org.dromara.hutool.core.text.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 公眾號 程式設計師三時
 * @version 1.0
 * @date 2023/7/16 11:00
 * @webSite https://github.com/coder-amiao
 */
@Component
public class MyLoginAuthorization implements LoginAuthorization {
@Autowired
private UserJwtToken userJwtToken;

@Override
public Boolean authorization(HttpServletRequest request, HttpServletResponse response, Object handler) {
    String token = request.getHeader("Token");

    Assert.isFalse(StrUtil.isEmpty(token),HttpStatus.UNAUTHORIZED);
    String userId = userJwtToken.getUserId(token);  //驗證token有效合法性。

    //其他資料庫 或者業務操作
    return true;
}
}

在設定類中注入bean

package cn.soboys.superaide.config;

import cn.soboys.restapispringbootstarter.authorization.*;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @author 公眾號 程式設計師三時
 * @version 1.0
 * @date 2023/7/15 09:49
 * @webSite https://github.com/coder-amiao
 * 使用者jwt token生成設定
 */
@Configuration
public class UserJwtConfig {


    @Bean
    public UserSign MyUserSign() {
        return new MyUserSign();
    }

    @Bean
    @Primary
    public LoginAuthorization loginAuthorizationSubject() {
        return new MyLoginAuthorization();
    }


    @Bean
    public UserJwtToken userJwtToken(UserSign MyUserSign) {
        UserJwtToken userJwtToken = new UserJwtToken();
        userJwtToken.setUserSign(MyUserSign);
        return userJwtToken;
    }
}

三方許可權認證框架

基於JWT Web Token也可以很輕鬆整合Shiro 或者是。Spring Security等其他第三許可權框架

當然後續版本我會把許可權認證獨立出來一個完整輕量級許可權框架專案。如:
通過註解@hasPerm,@hasRole,@hasAnyPerm,@hasAnyRoles
輕鬆實現相對複雜的許可權認證。

後續更新

通用業務

在我們聚焦專案開發時候,總是會有一些相對公共獨立的第三方業務模組。
如:三方登入,三方支付,訊息推播,資源上傳
後續我會持續整合。通用業務生態。 實現真的解放生產力。自由組合。

有任何程式設計問題。

關注公眾號,程式設計師三時 持續輸出優質內容 希望給你帶來一點啟發和幫助