“youlai-boot”进阶版:Java及Spring Boot企业级权限系统实战全面剖析

5小时前发布 gsjqwyl
1 0 0

“youlai-boot”进阶版:Java与Spring Boot企业级权限系统实战深度剖析

前言

本指南旨在为开发者提供关于“youlai-boot”项目的全面使用指引,涵盖项目相关介绍、快速启动流程、环境配置方法、功能操作步骤以及扩展实现等多方面内容。youlai-boot是一款基于Java 17和Spring Boot 3构建的企业级权限管理系统,适用于复杂的企业业务场景,通过该手册,开发者能够快速上手项目,并深入了解各模块的实现细节与最佳实践。

项目介绍

youlai-boot 是一款企业级的RBAC权限管理系统,采用Java 17、Spring Boot 3、Spring Security 6、MyBatis-Plus、Redis以及XXL-Job等主流后端技术栈构建,作为vue3-element-admin(Web端)和vue-uniapp-template(移动端)的后端服务,支持用户、角色、权限、部门、字典、配置等多种功能,满足企业级权限管理的需求。

项目特点
完善权限管控:支持精细的用户、角色、菜单和数据权限控制。
高效开发工具:内置前后端代码生成器,能快速搭建业务模块。
实时通信支持:基于WebSocket实现在线用户统计与消息推送。
系统安全机制:提供防重提交、分布式锁等保障数据安全的能力。
灵活定时任务:集成XXL-Job,可应对复杂的任务调度场景。

启动项目

以下是快速启动“youlai-boot”项目的完整步骤,从克隆项目到运行服务,助力您迅速上手。

克隆代码

打开IntelliJ IDEA,依次点击:File → New → Project from Version Control。在弹出窗口中输入项目地址:https://gitee.com/youlaiorg/youlai-boot.git,然后点击Clone。稍等片刻,待项目加载完成,项目结构将呈现如下模样:

配置环境

启动项目前,需确保开发环境满足以下条件:已安装并配置JDK和Maven。

配置JDK
打开项目结构配置面板File → Project Structure(快捷键Ctrl + Alt + Shift + S),确保SDK设置为已安装的JDK 17。

配置Maven
打开IDE设置面板:File → Settings(快捷键Ctrl + Alt + S),在Build, Execution, Deployment → Build Tools → Maven中,配置Maven使用本地安装的版本。验证Maven配置:打开IDEA终端,执行mvn -v命令,确保Maven使用的是JDK 17。正确输出示例如下:

启动项目

打开项目的主启动类YouLaiBootApplication。右键点击main方法,选择Debug YouLaiBootApplication.main()启动项目。

测试启动

项目启动成功后,可通过访问接口文档验证服务是否正常运行:访问Knife4j接口文档:http://localhost:8989/doc.html;访问Swagger接口文档:http://localhost:8989/swagger-ui.html

切换本地环境

安装Docker

项目中的MySQL、Redis、MinIO等中间件默认使用线上环境,一般禁止增删改操作。若想更好体验系统,建议在本地搭建MySQL、Redis等中间件,并切换到本地环境。手动搭建中间件及初始化数据库脚本可能较为耗时,推荐使用Docker和Docker Compose,通过项目提供的docker-compose脚本一键搭建MySQL、Redis并初始化数据库。安装Docker的教程如下:
Windows安装Docker和Docker Compose
Linux (CentOS)安装Docker和Docker Compose

安装中间件

安装好Docker和Docker Compose后,查看项目根目录中的docker-compose.yml脚本内容。进入项目目录,运行docker/run.md完成MySQL、Redis、MinIO和XXL-Job的安装与配置。运行后,打开Docker Desktop,确认中间件已成功安装。使用数据库可视化工具(如Navicat),可看到youlai-boot数据库已成功创建。中间件的默认配置如下,若端口号与本地应用冲突,可修改docker-compose.yml中对应的端口设置:

中间件 端口 用户名 密码 控制台
MySQL 3306 root 123456 /
Redis 6379 / 123456 /
MinIO 9000 minioadmin minioadmin http://lcalhost:9090
xxl-job-admin 8080 admin admin http://lcalhost:8080
修改本地配置
配置MySQL

在application-dev.yml文件中,将MySQL的连接信息替换为本地环境配置,如数据库地址、用户名和密码。默认端口为3306,默认用户名和密码为root/123456,根据实际情况修改。

配置Redis

在application-dev.yml文件中,将Redis的地址和密码替换为本地环境配置。若本地Redis未设置密码,可直接删除或注释掉password配置,避免连接失败。

配置MinIO (可选)

若项目中使用文件上传服务,需在application-dev.yml文件中修改MinIO的连接信息为本地环境配置,包括地址、用户名和密码。例如,默认端口为9000,默认用户名和密码为minioadmin/minioadmin,根据实际情况调整。

配置Xxl-Job (可选)

若项目中需要使用XXL-Job,需在application-dev.yml文件中开启配置。

操作指南

修改包名

默认包名为com.youlai.boot,若需修改为com.wuhui.boot,需进行以下改动:
– 修改启动类名称:将启动类从YoulaiBootApplication改为WuhuiBootApplication。
– 修改应用名称:在application.yml中将spring.application.name的值从youlai-boot修改为wuhui-boot;在pom.xml中将值从com.youlai改为com.wuhui。
– 修改接口文档包路径:否则接口文档不显示接口描述,在application-*.yml中修改接口文档扫描包路径。
– 代码生成的项目名称:在codegen.yml里修改后端项目名称codegen.backendAppName,将youlai-boot替换为wuhui-boot。

代码生成

以会员管理模块为例,讲解生成前后端代码以及新增模块时自动生成菜单路由的方法。

创建数据表

在数据库中执行以下SQL脚本创建会员信息表:

CREATE TABLE `member` (
    `id` int NOT NULL AUTO_INCREMENT COMMENT '会员编号',
    `name` varchar(50)  DEFAULT NULL COMMENT '会员姓名',
    `mobile` varchar(20) DEFAULT NULL COMMENT '会员手机号',
    `gender` tinyint DEFAULT NULL COMMENT '性别',
    `age` int DEFAULT NULL COMMENT '会员年龄',
    `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
    `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
    `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除(1:已删除;0:未删除)',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='会员信息表';
启动项目
  • 启动后端项目:youlai-boot
  • 启动前端项目:vue3-element-admin。在启动前端项目前,需修改.env.development文件中的接口地址为本地开发环境的后端服务地址。
生成代码

进入前端页面的代码生成器,在前端项目中找到“代码生成”菜单,选择member表,点击生成代码。填写基础配置信息,如业务名、主包名、模块名、实体名等,若需自动生成会员模块的菜单和按钮权限,可选择对应的上级菜单。配置字段信息,包括筛选、列表和表单的字段,可选择字段类型,若字段需要字典支持,可配置字典信息。配置完成后,可在线预览生成的前后端代码,并下载代码压缩包到本地。

集成代码

下载代码并解压,得到前后端代码。将后端代码复制到youlai-boot项目对应的目录中,确保项目重新加载新代码,并进行必要的构建和启动操作。同样将前端代码复制到前端项目中对应的目录。

功能测试

进入角色管理模块,为当前用户的角色分配新生成的会员管理菜单权限。勾选菜单中的会员信息选项,完成权限分配后刷新页面。若左侧菜单栏未显示会员信息菜单,尝试重新登录。进入会员管理模块,新增会员信息,新增成功后,在会员列表中可查看到刚添加的会员数据。

接口文档

接口文档的访问路径为应用地址/doc.html。在本地环境中,youai-boot项目的接口文档地址为:http://localhost:8989/doc.html

登录接口

由于大部分接口需要访问令牌(Token)进行身份认证,登录接口是使用接口文档的基础。通过登录接口获取成功返回的访问令牌后,可将其设置到接口文档的全局变量中,方便后续接口的测试。

设置全局Token

将登录接口返回的访问令牌设置为全局变量,步骤为:在接口文档右上角找到全局变量配置选项,输入令牌值后保存。

接口测试

设置好全局访问令牌后,打开其他接口时令牌已自动填充,无需手动为每个接口单独设置令牌,简化了测试流程。

定时任务

在之前的切换本地环境和安装中间件部分,通过Docker Compose一键安装了XXL-JOB。本节介绍配置和使用XXL-JOB的方法。XXL-JOB包含调度器和执行器两个主要角色,调度器是服务端,用于管理任务调度;执行器是应用端,用于执行任务的具体逻辑。
– XXL-JOB控制台地址:http://localhost:8080/xxl-job-admin
– 用户名/密码:admin/123456

修改配置

将xxl.job.enabled设置为true,并调整调度中心地址为实际安装地址,其他配置可保持默认。

添加执行器

在application-dev.yml中,执行器的应用名称(xxl.job.executor.appname)默认配置为xxl-job-executor-${spring.application.name},其中${spring.application.name}会解析为当前应用名称。在XXL-JOB控制台中添加执行器,appname配置为xxl-job-executor-youlai-boot,由于采用自动注册方式,重启youlai-boot应用后,刷新执行器列表,可看到机器已成功注册。

添加任务

在youlai-boot应用中添加任务执行逻辑,示例代码如下:

package com.youlai.boot.system.handler;

@Component
@Slf4j
public class XxlJobSampleHandler {

    @XxlJob("demoJobHandler")
    public void demoJobHandler() {
        log.info("XXL-JOB, Hello World.");
    }

}

在XXL-JOB控制台中进入“任务管理”页面,选择新增任务,选择刚刚创建的youlai-boot应用对应的执行器,配置Cron表达式设定任务执行时间和频率,设置任务模式为Bean模式,调用Spring容器中的Bean,其中Bean名称为@XxlJob(“demoJobHandler”)中定义的demoJobHandler。

定时任务测试

任务创建完成后,在“操作”列中选择启动进行测试。调度器和执行器需在网络上互通,若调度器部署在云服务器上,而执行器运行在本地,可能无法正常运行,建议将应用也部署到云服务器。启动任务后,可查看应用控制台日志,验证任务是否正确执行。

文件上传

youlai-boot目前支持MinIO、阿里云以及本地文件存储方式,以下以MinIO为例演示文件上传。

创建存储桶

在上一章节切换本地环境和安装中间件中,通过Docker Compose快速安装了MinIO,若尚未安装,可参考Docker部署MinIO对象存储系统。MinIO控制台地址:http://localhost:9090/,默认用户名/密码:minioadmin/minioadmin。登录控制台,访问http://localhost:9090/buckets/add-bucket页面,创建名为youlai的存储桶,并设置存储桶的访问权限为public。

修改应用配置

打开项目的application-dev.yml文件,配置文件存储相关参数,指定oss.type为minio,设置服务地址为http://localhost:9000,使用默认访问凭据:用户名minioadmin,访问密钥minioadmin,存储桶名称为前文创建的youlai。

文件上传测试

启动项目后,访问接口文档http://localhost:8989/doc.html,选择文件上传接口,上传文件后会返回对应的文件URL,将返回的URL粘贴到浏览器中,即可预览上传的文件。

项目功能

数据权限

为实现多租户和权限控制,可通过MyBatis-Plus自定义数据权限注解和处理器动态过滤数据。

实现原理

通过自定义拦截器实现DataPermissionHandler接口,在youlai-boot中,MyDataPermissionHandler是具体实现类,用于在SQL执行前动态拼接权限过滤条件。处理逻辑包括获取用户权限范围、动态生成筛选条件并追加到原始SQL的WHERE子句。

使用示例

在数据持久层的方法中,若需实现数据权限控制,可直接在方法上添加@DataPermission注解。例如:

UserMapper.java

@Mapper
public interface UserMapper {

    @DataPermission(
        deptAlias = "u", // 部门字段的表别名,用于标记SQL中部门字段的来源表
        deptIdColumnName = "dept_id", // 部门字段的列名,默认为dept_id
        userAlias = "u", // 用户字段的表别名,用于标记SQL中用户字段的来源表
        userIdColumnName = "create_by" // 用户字段的列名,默认为create_by
    )
    Page<UserBO> getUserPage(Page<UserBO> page, UserPageQuery queryParams);
}

UserMapper.xml

<select id="getUserPage">
    SELECT
        u.id,
        u.username,
        u.nickname,
        u.dept_id
    FROM
        sys_user u
    WHERE
        u.is_deleted = 0
</select>

动态SQL示例:
– 权限范围:部门及以下

SELECT u.id, u.username, u.nickname, u.dept_id 
FROM sys_user u 
WHERE u.is_deleted = 0 
  AND u.dept_id IN (SELECT id FROM sys_dept WHERE id = 3 OR FIND_IN_SET(3, tree_path));

其中AND u.dept_id IN (SELECT id FROM sys_dept WHERE id = 3 OR FIND_IN_SET(3, tree_path))是MyDataPermissionHandler根据用户权限为“部门及以下”动态追加的筛选条件。
– 权限范围:本人创建

SELECT u.id, u.username, u.nickname, u.dept_id 
FROM sys_user u 
WHERE u.is_deleted = 0 
  AND u.create_by = 2;

其中AND u.create_by = 2是MyDataPermissionHandler根据用户权限为“本人创建”动态追加的筛选条件。

防重提交

为防止用户短时间内多次提交相同请求,系统提供防重复提交功能,通过简单注解配置即可实现。

使用防重提交

在需要防重复提交的接口上添加@RepeatSubmit注解,通过注解参数expire灵活控制重复提交的时间间隔(单位:秒),若不设置,默认时间为5秒。示例:

@Operation(summary = "新增用户")
@PostMapping
@RepeatSubmit(expire = 3) // 3秒内禁止重复提交
public Result<?> saveUser(
    @RequestBody @Valid UserForm userForm
) {
    // TODO 新增用户逻辑
    return Result.success();
}
测试防重提交

模拟短时间内的多次请求验证防重复提交效果,通过简单配置可有效防止重复提交,确保接口的安全性和稳定性。

IP限流

为防止接口被恶意刷取,系统内置IP限流机制,当同一IP在单位时间内的请求次数超过限制时,系统将对该IP进行访问限制。

配置QPS

可通过访问管理后台的系统管理→系统配置菜单设置QPS阈值(单位时间最大请求数),若未配置或禁用该选项,则表示关闭IP限流功能。

限流测试

模拟测试:20个线程同时发起请求,当QPS配置为10时,部分请求将因限流而失败,部分失败的请求如下所示。

项目扩展

多数据源支持

随着业务复杂性增加,单一数据源可能无法满足需求,本节介绍基于youlai-boot使用dynamic-datasource实现多数据源支持的方法。

添加依赖

在pom.xml中添加如下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
    <version>4.3.1</version>
</dependency>
配置多数据源
© 版权声明

相关文章

暂无评论

暂无评论...