# ji-spring-boot-starter **Repository Path**: ok-cloud/ji-spring-boot-starter ## Basic Information - **Project Name**: ji-spring-boot-starter - **Description**: SpringBoot扩展:一个最基础的JWT + 拦截器SDK! - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: http://ji.xlbweb.cn - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-01-28 - **Last Updated**: 2023-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

一个最基础的 JWT + 拦截器 SDK!

--- # 项目简介 JI 即 jwt interceptor的缩写,项目起源的初衷是由于作者在个人项目和公司项目中有多处使用到 JWT 鉴权的场景,导致每个项目都写了大量 JWT 相关的重复代码,为了避免重复工作,故而将 **JWT + 拦截器** 部分代码抽取出来作为公共 SDK 给其他项目使用,也好达到统一升级的好处。 # 快速开始 ## 1、克隆项目 ``` git clone https://gitee.com/ok-tool/ji-spring-boot-starter.git ``` ## 2、执行打包 ``` mvn clean install -Dmaven.test.skip=true ``` ## 3、引入依赖 ```xml cn.xlbweb ji-spring-boot-starter 1.0.0 ``` ## 4、配置文件 ```properties # 开启JI组件(默认不开启) cn.xlbweb.ji.enabled=true # 白名单请求 cn.xlbweb.ji.exclude-uris=/** # 前后端交互token名称 cn.xlbweb.ji.token-name=JiToken # token有效时间(单位分钟,默认60分钟) cn.xlbweb.ji.token-expiration-time=60 ``` ```properties # token为空的响应码和响应信息 cn.xlbweb.ji.token-not-blank-code=1001 cn.xlbweb.ji.token-not-blank-message=Token不能为空 # token过期的响应码和响应信息 cn.xlbweb.ji.token-expired-code=1002 cn.xlbweb.ji.token-expired-message=Token已过期 # token验证失败的响应码和响应信息 cn.xlbweb.ji.token-invalid-code=1003 cn.xlbweb.ji.token-invalid-message=Token校验失败 # 用户无权限的响应码和响应信息 cn.xlbweb.ji.no-permission-code=1004 cn.xlbweb.ji.no-permission-message=用户无权限 ``` # 常用方法 ## 1、加密解密 ```java JwtUtils.encrypt("要加密的字符串") JwtUtils.decrypt("要解密的字符串") // 从请求头中获取token并解密 JwtUtils.decrypt(); ``` ## 2、账号&角色 ```java String accunt = JwtUtils.getAccunt(); String role = JwtUtils.getRole(); ``` 约定:为了正确的获取账号和角色信息,建议用户登录成功后生产的 token 串是由 **账号+角色** 组成,调用下面方法即可。 ```java JwtUtils.encryptBySpliceUserInfo(ACCOUNT, ROLE) ``` ## 3、过期时间 ```java JwtUtils.getExpirationTime(token); // 从请求头中获取token并解密获取过期时间 JwtUtils.getExpirationTime(); ``` ## 4、Subject ```java JwtUtils.getSubject(token); // 从请求头中获取token并解密获取getSubject JwtUtils.getSubject(); ``` ## 5、权限(注解) SDK 内置了两个角色(admin 和 manager),可在 Controller 层方法 api 上面加上 `@RequiresAdmin` 和 `@RequiresManager` 注解进行使用。 ### @RequiresAdmin ```java @GetMapping("/users/{id}") // 需要超级管理员权限 @RequiresAdmin public ServerResponse getUser(@PathVariable Integer id) { return userService.getUser(id); } ``` ### @RequiresManager ```java @GetMapping("/users/{id}") // 需要普通管理员权限 @RequiresManager public ServerResponse getUser(@PathVariable Integer id) { return userService.getUser(id); } ``` ### 如何扩展注解 待补充... ## 6、权限(拦截器) 待补充... # 关于返回 SDK 的所有返回信息均通过 json 形式返回,以下是几种常见返回信息, **可以通过配置文件对默认值进行修改**。 **注意:token 信息目前只支持前端放在http请求头中发送到后台,否则后台拿到的值为null。** ```json { "code": 1001, "message": "Token不能为空" } ``` - token 信息过期,验证不通过; ```json { "code": 1002, "message": "Token已过期" } ``` - token 信息不正确,如错误的 token 或瞎传 token,验证不通过; ```json { "code": 1003, "message": "Token验证失败" } ``` - 权限不够时; ```json { "code": 1004, "message": "用户无权限" } ``` # 使用样例 针对以上几点而言,为了更好的使用 SDK 的功能,以下为 JwtUtils 的常用功能和用户登录逻辑示例,方便大家参考。 ```java // 加密(账号和角色一起加密) String token = JwtUtils.encryptBySpliceUserInfo("zhangsan", "ADMIN"); System.out.println(token); // 解密 String parseResult = JwtUtils.decrypt(token); System.out.println(parseResult); // 账号,token会自动从request header中获取 String account = JwtUtils.getAccount(); System.out.println(account); // 角色,token会自动从request header中获取 String role = JwtUtils.getRole(); System.out.println(role); ``` ```java @Override public ResponseServer login(LoginDTO dto) { String md5Password = DigestUtils.md5DigestAsHex(dto.getPassword().getBytes()); UserDO userDO = userRepository.findByUsernameAndPassword(dto.getAccount(), md5Password); if (Objects.nonNull(userDO)) { RoleDO roleDO = roleRepository.getOne(userDO.getRoleId()); return ResponseServer.success("登录成功", JwtUtils.encryptBySpliceUserInfo(userDO.getAccount(), roleDO.getName)); } return ResponseServer.error("登录失败,账号或密码错误"); } ``` # 参考项目 https://gitee.com/ok-cloud/ji-spring-boot-starter/tree/demo # 未来规划 - 依赖上传到 Maven 中央仓库; - 在依赖外部最小的情况下,引入更多场景。 如果有任何想法或意见,欢迎 issue 或 pr,QQ 交流群:956194623