# NoBugBoot **Repository Path**: wkk981014/NoBugBoot ## Basic Information - **Project Name**: NoBugBoot - **Description**: 基于Springboot 、Mybatis-Plus 、MySQL、Redis、Shiro、Jwt、Vue的前后端分离项目,核心模块,token无状态认证与无痛刷新,动态操作定时任务,自定义JVM缓存YuLi等等 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: https://gitee.com/wkk981014/NoBugBoot - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 1 - **Created**: 2020-08-17 - **Last Updated**: 2021-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NoBugBoot #### 介绍 - 后端基础架构Springboot + Mybatis-Plus + MySQL + redis - 前端基础架构Vue-cli3 + j-cookie + vuex - restful风格API,前后端分离 JSON交互 - 基于Shiro+Jwt实现无状态鉴权机制(Token) - 基于WebSocket实现:公告消息 、一对一消息、一对多消息的发送 - 基于Quartz实现:定时任务的自定义实现以及控制 - 统一的全局异常处理以及统一回复前端结果,Validation数据校验 - 封装BaseDtoForm(用于dto转换成entity) 以及 PageVo(分页对象) - 自定义工具类 NoBugTools (实体类对象-list对象集合-分页对象的转换以及判空) - 基于Mybatis-Plus的代码生成工具 - 配置文件重要信息加密jasypt - 自定义JVM缓存YuLi小模块(带有持久化策略以及对外暴露接口) - 公共自定义注解 1) @AutoLog - AOP日志 2) @RedisCache - AOP缓存 3) @ResponseResultBody - 统一返回格式 4) @TokenCache - @RedisCache的升级版 加入更多操作可能 - 有趣的工具类:IO在线获取资源、二维码生成器、代码生成器等等 #### 软件架构 - Springboot 2.1.3 - Mybatis-Plus 3.3.2 - MySQL 8.0.18 - Redis 2.1.3 - Shiro 1.4.0 - Jwt 3.7.0 - WebSocket 2.1.3 - Quartz 2.1.3 - Swagger 2.9.2 #### YuLi模块介绍 - 数据结构:采用key-value的形式存储 - 对象上线:可通过修改Config文件对象值来改变 - 过期时间: 目前有两种策略-可以通过修改config文件抉择 1) 被动:即查它时才删除 2) 主动: 启动定时任务过几秒进行判定-具体时间可以通过 修改config文件实现 - 线程安全:采用ConcurrentHashMap结构来保证线程安全 - 接口方面:对外暴露YuTemplate 即可实现操作 - 是否持久化:持久化是否开启以及如何使用持久化均可以通过 修改配置文件Config实现-持久化文件名称路径也可修改 1) 每次:只要执行一次set remove操作就会刷新持久化文件 2) 每隔一段时间:开启定时任务实现 - 阻塞机制:(待开发) - 清除策略:(待开发)目前只能依靠过期时间以及其相关策略实现 key-value键值对的清除。 - 可视化界面:(待开发) #### Authentication 认证模块介绍 - 核心内容是 token认证与无痛刷新Token - 认证思想:通过JwtFilter去拦截所有需要认证的请求, 判断其请求头中是否包含符合要求的Token,如果不包含则 无法访问接口。 - token:携带用户信息的加密字符串,我们通过Jwt拦截 请求,在通过获取token信息进行shiro用户认证。token 存在有效时间,为了保证用户不掉线,在redis中需要创建 一个和token有关联的refresh-token,用于token过期时 重新刷新token并反馈给用户。 - 判断当前token无效情况 1) token不符合解密规则 2) token中不包含加密时的uid 3) token过期 4) redis中不存在refresh-token 5) redis中的refresh-token与token中的时间戳不一致 - 无痛刷新token:在上一点的基础上,如果当前token过期,但是与redis 中对应的refresh-token时间戳一致,则创建一个新的token,以及刷新 redis中的refresh-token。再将这个新的token放入响应头中,让前端去捕获。 - nobug-vue中的写法:在utils包中有一个request.js文件,内部编写了 axios的请求响应拦截器(使用cookie存储)。 1) 响应拦截器:只要响应头中存在authentication的,就 将其内容存到cookie中。 2) 请求拦截器:将cookie中的信息放入请求头的authentication 字段中。 #### Authorization 鉴权模块介绍(接口未完成) - 模块核心:shiro+redis 管理角色与权限 - 效果描述: 只有拥有某角色或某权限的用户才能访问某些接口(通过注解实现) - shiro-redis:启用了redis去管理鉴权,基本原理:如果用户去访问带有鉴权注解的接口,就会 执行shiro的鉴权机制,由于权限不会常常变动,就没变要一直访问数据库。redis管理之后,如果缓 存中有指定命名的key,则返回key对应的value中的权限信息。 - 如果变动,需要通过AOP实现缓存的刷新。 - 认证与鉴权需要建立6张表 用户表,角色表,权限表,用户角色表, 角色权限表,以及用户权限表。最后一张用户权限表是为了单独给某用户 添加或移除某权限。 - Jwt认证请查看authentication模块 - 鉴权: 集成redis 以及通过注解的方式实现。 - 注解方式:配置在shiroConfig文件中,只要添加配置,便可以 在Controller的接口上添加注解,只要访问有注解的接口,就要 进行鉴权,具体需要什么权限,就看注解上的内容。注意:AOP可能 会引起冲突,所以强制使用了cglib,所以注入XxxRealm的时候需要 添加@Lazy注解,否者这些注入的对象AOP将无法生效。 - 通过redis管理鉴权的缓存,配置也在shiroConfig文件中, 具体实现便是,只要访问一次鉴权方法。redis内部就会生成一个 键值对,下次访问方法时,不在进行方法逻辑,直接返回redis中 的结果,注意:本项目中未做缓存刷新。如果要缓存刷新,建议查看 common中的aop和annotation包下的文件,进行缓存刷新。否则 用户的权限将会被定格。 #### 定时任务模块介绍 - 通过quartz框架实现具体配置在application-test.yml文件中 - 我们可以通过API对任务进行CRUD操作 - 核心就是job与schedule,任务与任务调度 - 将任务逻辑写在job中,再通过schedule进行调度 - 只要执行上一步quartz就会持久化,如果移除job调度, quartz的数据库表也会移除相应的触发器任务信息以及cron信息 - 此模块的实际情况在YuLi中的删除策略与持久化策略中均有应用 #### WebSocket模块介绍(只实现了部分功能) - 消息的群发,私发,多发API均已实现,采用restful风格 - 前端通过Vue已经可以成功对接 - 核心文件WebSocketService 、WebSocketConfig - 前端显示文件 welcome.vue或webSocketTest.vue - 核心问题:WebSocketService无法自动注入具体解释以及解决方法 均已写在该文件的注释中。