首页 > 其他分享 >我开源了团队内部基于SpringBoot Web快速开发的API脚手架v1.6.0更新

我开源了团队内部基于SpringBoot Web快速开发的API脚手架v1.6.0更新

时间:2023-07-25 09:22:06浏览次数:56  
标签:Web org Token token API v1.6 import userJwtToken public

什么是 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
轻松实现相对复杂的权限认证。

后续更新

通用业务

在我们聚焦项目开发时候,总是会有一些相对公共独立的第三方业务模块。
如:三方登录,三方支付,消息推送,资源上传
后续我会持续集成。通用业务生态。 实现真的解放生产力。自由组合。

有任何编程问题。

关注公众号,程序员三时 持续输出优质内容 希望给你带来一点启发和帮助

标签:Web,org,Token,token,API,v1.6,import,userJwtToken,public
From: https://www.cnblogs.com/kenx/p/17578865.html

相关文章

  • WEB漏洞—文件操作之文件下载读取
    文件下载,读取原理,检测,利用,修复等#利用数据库配置文件下载或读取后续接口密匙信息文件下载或读取后续#文件名,参数值,目录符号read.xxx?filename=down.xxx?filename=readfile.xxx?file=downfile.xxx?file=../..\.\./等%00?%23%20.等&readpath=、&filepath=、&......
  • 老杜 JavaWeb 讲解(十四) ——JSP+Servlet改造oa项目
    (十四)JSP改造oa项目相关视频:38-Servlet和JSP改造oa项目使用Servlet+JSP完成oa项目的改造使用Servlet处理业务,收集数据。使用JSP展示数据。将之前原型中的html文件,全部修改为jsp,然后在jsp文件头部添加page指令(指定contentType防止中文乱码),将所有的JSP直接拷贝到web......
  • 协议 tcp rpc http websocket
    传输层:tcp,udp应用层:http,grpc,websocket浏览器服务器太多了,互相沟通需要统一的协议,http主要用于B/S如果是公司内部,轻量小巧定制化,用rpchttp是半双工,同一时间,只能一方发送消息,客户发送请求,建立http连接后,通过header可以申请升级到websocket协议 待补充wireshark的抓包分析:......
  • 【网络编程】基础知识(Web Server和HTTP协议)
    WebServer一个WebServer就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error......
  • 基于web的网上书城系统
    完整资料进入【数字空间】查看——baidu搜索"writebug"一、摘要随着前端各种新兴技术的崛起,我们编写前端已经不仅仅局限于html,css,js,而是有了更多的选择,用更加简洁的代码就可以实现更加完美的功能。“基于web的网上书城系统”的前端开发就是采用vue和基于vue开发的桌面组件库element......
  • CTFer成长记录——CTF之Web专题·bugku-啊哒
    一、题目链接  https://ctf.bugku.com/challenges/detail/id/6.html?id=6二、解法步骤  打开图片:  显示完整,似乎没有文件高度的问题。右键查看属性——>文件详细信息:发现一串16进制数:尝试转换成字符串:https://www.sojson.com/hexadecimal.html  得到:sdnisc_20......
  • CTFer成长记录——CTF之Web专题·bugku-眼见非实
    一、题目链接  https://ctf.bugku.com/challenges/detail/id/5.html二、解法步骤  解法压缩包是一个.docx文件,打开该文件后发现一堆乱码:  结合题意:“眼见非实”,猜测该docx文件融合了其他的文件。用010打开看看:  发现了压缩包的文件头,于是用binwalk尝试文件拆分:binwal......
  • 实战演示:Apipost接口自动化测试
    Apipost提供了可视化的接口自动化测试平台,合理运用事物控制器、条件控制器、循环控制器等控制器,可以满足各种复杂测试需求。适用场景:复杂的多接口多场景回归测试比较费时费力,自动化测试平台搭建成本、维护成本太高。这里小编用电商平台购物流程来给大家介绍在Apipost中接口变量的......
  • Vue WebSocket的实现 含断线重连
    vue客户端 main.jsimport{createApp}from'vue'import{reactive}from'vue'importAppfrom'./App.vue'import{webSocketUrl}from'/public/static/config.json'letwebsock=null;constapp=createApp(App);......
  • Web流程图绘制使用raphael
    摘要:本文要实现一个流程图的绘制,最终的目标是实现流程图的自动绘制,并可进行操作,直接点击流程图上对应的方框就可以让后台跑相应的程序。一、插件介绍1、图形绘制raphael其中图形绘制使用了raphael,下载地址:http://raphaeljs.com,它的功能非常强大。其中有一些DEMO如下:Web流程图......