Java进阶指南
表达式解析
UEL 统一表达式语言
Ognl 对象图导航语言
Spel Spring表达式语言
Java 进阶
SPI的高级用法
SLF4J的绑定原理
H2 JDBC驱动类注册与数据库引擎初始化原理
Java SPI与Dubbo SPI区别
Java 秒懂对象 PO、VO、BO、DTO、POJO!
Java POJO/DO/DTO/BO/VO概念及应用案例分析
一个线程oom,进程里其他线程还能运行吗?
jps命令详解
Java的BigDecimal也会存在丢失精度的问题
java中的枚举类和常量类区别在哪儿?
Java 打包 FatJar 方法小结
"too many open files"的原理和解决方案
GraalVM 专栏
GraalVM入门以及环境搭建
Maven 专栏
maven 跳过单元测试-maven.test.skip和skipTests的区别
maven 配置代码检查插件,生成检查报告
Maven 执行生命周期
maven 删除本地仓库当前项目的依赖包
Gradle 专栏
自己动手应用Groovy实现Gradle的DSL—Task定义
看懂Gradle脚本(1)- Groovy语言的Map语法糖
看懂Gradle脚本(2)- Groovy语言的闭包语法
看懂Gradle脚本(3)- Groovy AST转换
看懂Gradle脚本(4)- Groovy语法之运算符重载
看懂Gradle脚本(5)- 跟Gradle学领域驱动设计
看懂Gradle脚本(6)- Hello Groovy, Goodbye Getters&Setters
看懂Gradle脚本(7)- ext {}函数是如何实现的
Gradle 常见问题集锦
Spring 专栏
Spring AOP 使用介绍,从前世到今生
Spring IOC 容器源码分析
Spring AOP 源码解析
Spring @PropertySource 注解实现读取 yml 文件
Spring 好用的工具类
Spring @Async失效情况
Spring I/O 2023 干货视频精选!
Spring 动态刷新bean
Spring Cache缓存技术
Spring @Transactional注解失效情况
Spring Event 事件订阅踩坑
循环依赖
Spring 解析@Async引起的循环依赖
Spring 中的循环依赖
从源码层面深度剖析 Spring 循环依赖 | 京东云技术团队
Spring 不同平台构建出现循环依赖错误问题原因分析
SpringBoot 专栏
SpringBoot 构建FarJAR Maven配置
SpringBoot 项目启动慢原因分析
SpringBoot 资源文件问题总结(Spring Boot的静态资源访问,配置文件外置)
SpringBoot 读取Jar包中静态资源原理
SpringBoot 配置Undertow处理高并发
SpringBoot Maven Profile配合Spring Profile进行多环境配置和打包
SpringBoot 使用profile结合maven实现多环境配置
SpringBoot @ComponentScan注解过滤排除不加载某个类的3种方法
Mybatis 专栏
Mybatis 一级、二级缓存机制
Mybatis 关闭一级、二级缓存机制
MybatisPlus
MybatisPlus LambdaQueryWrapper类的实现原理
MybatisPlus 在不修改全局策略和字段注解的情况下将字段更新为null
并发与多线程
Java 从单核到多核的多线程并发
并发和并行的区别
Redisson 专栏
一次生产redisson 延时队列不消费问题排查
redisson 阻塞队列不消费问题排查
Spring Batch 专栏
批处理框架spring batch基础知识介绍
Shiro 专栏
一篇适合小白的Shiro教程
SpringMVC 专栏
SpringMVC 后端处理多文件上传如何保持最大的灵活性
@RequestParam的加与不加的作用
SpringCloud 专栏
Gateway 一文彻底解决跨域问题
ruoyi-vue-pro 开发指南
萌新必读
简介
交流群
视频教程
功能列表
快速启动(后端项目)
快速启动(前端项目)
接口文档
技术选型
项目结构
代码热加载
一键改包
删除功能
内网穿透
达梦数据库专属
后端手册
新建模块
代码生成【单表】(新增功能)
代码生成【主子表】
代码生成【树表】
功能权限
数据权限
用户体系
三方登录
OAuth 2.0(SSO 单点登录)
SaaS多租户【字段隔离】
SaaS 多租户【数据库隔离】
WebSocket 实时通讯
异常处理(错误码)
参数校验、时间传参
分页实现
VO 对象转换、数据翻译
文件存储(上传下载)
Excel 导入导出
操作日志、访问日志、异常日志
MyBatis 数据库
MyBatis 联表&分页查询
多数据源(读写分离)、事务
Redis 缓存
本地缓存
异步任务
分布式锁
幂等性(防重复提交)
请求限流(RateLimiter)
单元测试
验证码
工具类
配置管理
数据库文档
中间件手册
定时任务
消息队列(内存)
消息队列(Redis)
消息队列(RocketMQ)
消息队列(RabbitMQ)
消息队列(Kafka)
限流熔断
工作流手册
工作流演示
功能开启
工作流(达梦适配)
审批接入(流程表单)
审批接入(业务表单)
流程设计器(BPMN)
流程设计器(钉钉、飞书)
选择审批人、发起人自选
会签、或签、依次审批
流程发起、取消、重新发起
审批通过、不通过、驳回
审批加签、减签
审批转办、委派、抄送
执行监听器、任务监听器
流程表达式
流程审批通知
大屏手册
报表设计器
大屏设计器
支付手册
功能开启
支付宝支付接入
微信公众号支付接入
微信小程序支付接入
支付宝、微信退款接入
会员手册
功能开启
微信公众号登录
微信小程序登录
会员用户、标签、分组
会员等级、积分、签到
商城手册
商城演示
功能开启
商城装修
【商品】商品分类
【商品】商品属性
【商品】商品 SPU 与 SKU
【商品】商品评价
【交易】购物车
【交易】交易订单
【交易】售后退款
【交易】快递发货
【交易】门店自提
【交易】分销返佣
【营销】优惠劵
【营销】拼团活动
【营销】秒杀活动
【营销】砍价活动
【营销】满减送
【营销】限时折扣
【营销】内容管理
【统计】会员、商品、交易统计
ERP手册
ERP 演示
功能开启
【产品】产品信息、分类、单位
【库存】产品库存、库存明细
【库存】其它入库、其它出库
【库存】库存调拨、库存盘点
【采购】采购订单、入库、退货
【销售】销售订单、出库、退货
【财务】采购付款、销售收款
CRM 手册
CRM 演示
功能开启
【线索】线索管理
【客户】客户管理、公海客户
【商机】商机管理、商机状态
【合同】合同管理、合同提醒
【回款】回款管理、回款计划
【产品】产品管理、产品分类
【通用】数据权限
【通用】跟进记录、待办事项
公众号手册
功能开启
公众号接入
公众号粉丝
公众号标签
公众号消息
自动回复
公众号菜单
公众号素材
公众号图文
公众号统计
系统手册
短信配置
邮件配置
站内信配置
数据脱敏
敏感词
地区 & IP 库
运维手册
开发环境
Linux 部署
Docker 部署
Jenkins 部署
HTTPS 证书
服务监控
前端手册 Vue 3.x
开发规范
菜单路由
Icon 图标
字典数据
系统组件
通用方法
配置读取
CRUD 组件
国际化
IDE 调试
代码格式化
前端手册 Vue 2.x
开发规范
菜单路由
Icon 图标
字典数据
系统组件
通用方法
配置读取
更新日志
【v2.1.0】开发中
【v2.0.1】2024-03-01
【v2.0.0】2024-01-26
【v1.9.0】2023-12-01
【v1.8.3】2023-10-24
yudao-cloud 开发指南
萌新必读
简介
交流群
视频教程
功能列表
快速启动(后端项目)
快速启动(前端项目)
接口文档
技术选型
项目结构
代码热加载
一键改包
删除功能
内网穿透
达梦数据库专属
微服务手册
微服务调试(必读)
注册中心 Nacos
配置中心 Nacos
服务网关 Spring Cloud Gateway
服务调用 Feign
定时任务 XXL Job
消息队列(内存)
消息队列(Redis)
消息队列(RocketMQ)
消息队列(RabbitMQ)
消息队列(Kafka)
消息队列(Cloud)
分布式事务 Seata
服务保障 Sentinel
Spring Security 专栏
Spring Security 入门
Spring Security OAuth2 入门
Spring Security OAuth2 存储器
Spring Security OAuth2 单点登录
Spring Security 常见问题
Guava 专栏
Guava 常用API汇总
本文档使用 MrDoc 发布
-
+
首页
Spring Security 入门
> 本文在提供完整代码示例,可见 [https://github.com/YunaiV/SpringBoot-Labs](https://github.com/YunaiV/SpringBoot-Labs) 的 对应 [lab-01-spring-security](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security) 目录。 > > 原创不易,给点个 [Star](https://github.com/YunaiV/SpringBoot-Labs/stargazers) 嘿,一起冲鸭! # 1\. 概述 基本上,在所有的开发的系统中,都必须做认证(authentication)和授权(authorization),以保证系统的安全性。😈 考虑到很多胖友对认证和授权有点分不清楚,艿艿这里引用一个网上有趣的例子: > FROM [《认证 (authentication) 和授权 (authorization) 的区别》](https://www.cnblogs.com/joooy/archive/2010/08/08/1795257.html) > > - authentication \[ɔ,θɛntɪ'keʃən\] 认证 > - authorization \[,ɔθərɪ'zeʃən\] 授权 > > 以**打飞机**举例子: > > - 【认证】你要登机,你需要出示你的 passport 和 ticket,passport 是为了证明你张三确实是你张三,这就是 authentication。 > - 【授权】而机票是为了证明你张三确实买了票可以上飞机,这就是 authorization。 > > 以**论坛**举例子: > > - 【认证】你要登录论坛,输入用户名张三,密码 1234,密码正确,证明你张三确实是张三,这就是 authentication。 > - 【授权】再一 check 用户张三是个版主,所以有权限加精删别人帖,这就是 authorization 。 所以简单来说:认证解决“你是谁”的问题,授权解决“你能做什么”的问题。另外,在推荐阅读下[《认证、授权、鉴权和权限控制》](http://www.iocoder.cn/Fight/user_login_auth_terms/?self) 文章,更加**详细明确**。 在 Java 生态中,目前有 [Spring Security](https://spring.io/projects/spring-security) 和 [Apache Shiro](https://shiro.apache.org/) 两个安全框架,可以完成认证和授权的功能。本文,我们先来学习下 Spring Security 。其官方对自己介绍如下: > FROM [《Spring Security 官网》](https://spring.io/projects/spring-security) > > Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications. > Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于 Spring 的应用程序。 > > Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements > Spring Security 是一个框架,侧重于为 Java 应用程序提供身份验证和授权。与所有 Spring 项目一样,Spring 安全性的真正强大之处,在于它很容易扩展以满足定制需求。 # 2\. 快速入门 > 示例代码对应仓库:[lab-01-springsecurity-demo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo) 。 在本小节中,我们来快速入门下 Spring Security ,实现访问 API 接口时,需要首先进行登录,才能进行访问。 ## 2.1 引入依赖 在 [`pom.xml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-01-spring-security/lab-01-springsecurity-demo/pom.xml) 文件中,引入相关依赖。 <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="php" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><?</span>xml version=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"1.0"</span> encoding=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"UTF-8"</span><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">?></span></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">project</span> <span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">xmlns</span>=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"http://maven.apache.org/POM/4.0.0"</span></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"> <span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">xmlns:xsi</span>=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"> <span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">xsi:schemaLocation</span>=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">parent</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">groupId</span>></span>org.springframework.boot<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">groupId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span>spring-boot-starter-parent<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">version</span>></span>2.1.10.RELEASE<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">version</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">relativePath</span>/></span> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"><!-- lookup parent from repository --></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">parent</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">modelVersion</span>></span>4.0.0<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">modelVersion</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span>lab-01-springsecurity-demo<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">dependencies</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"><!-- 实现对 Spring MVC 的自动化配置 --></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">dependency</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">groupId</span>></span>org.springframework.boot<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">groupId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span>spring-boot-starter-web<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">dependency</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"><!-- 实现对 Spring Security 的自动化配置 --></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">dependency</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">groupId</span>></span>org.springframework.boot<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">groupId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span>spring-boot-starter-security<span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">artifactId</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">dependency</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">dependencies</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="tag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"></<span class="name" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">project</span>></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。 ## 2.2 Application 创建 [`Application.java`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java) 类,配置 `@SpringBootApplication` 注解即可。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// Application.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@SpringBootApplication</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">Application</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">main</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String[] args)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> SpringApplication.run(Application.class, args);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ## 2.3 配置文件 在 [`application.yml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-01-spring-security/lab-01-springsecurity-demo/src/main/resources/application.yaml) 中,添加 Spring Security 配置,如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">spring:</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"># Spring Security 配置项,对应 SecurityProperties 配置类</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> security:</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"># 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> user:</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> name:</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">user</span> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"># 账号</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> password:</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">user</span> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"># 密码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> roles:</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">ADMIN</span> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"># 拥有角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 在 `spring.security` 配置项,设置 Spring Security 的配置,对应 [SecurityProperties](https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityProperties.java) 配置类。 - 默认情况下,Spring Boot [UserDetailsServiceAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/servlet/UserDetailsServiceAutoConfiguration.java) 自动化配置类,会创建一个**内存级别**的 [InMemoryUserDetailsManager](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/provisioning/InMemoryUserDetailsManager.java) Bean 对象,提供认证的用户信息。 - 这里,我们**添加了** `spring.security.user` 配置项,UserDetailsServiceAutoConfiguration 会基于配置的信息创建一个用户 [User](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/User.java) 在内存中。 - 如果,我们**未添加** `spring.security.user` 配置项,UserDetailsServiceAutoConfiguration 会自动创建一个用户名为 `"user"` ,密码为 UUID 随机的用户 [User](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/User.java) 在内存中。 ## 2.4 AdminController 在 [`cn.iocoder.springboot.lab01.springsecurity.controller`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller) 包路径下,创建 [AdminController](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java) 类,提供管理员 API 接口。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// AdminController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RestController</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RequestMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/admin"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">AdminController</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/demo"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">demo</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"示例返回"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 这里,我们先提供一个 `"/admin/demo"` 接口,用于测试未登录时,会被拦截到登录界面。 ## 2.5 简单测试 执行 `Application#main(String[] args)` 方法,运行项目。 项目启动成功后,浏览器访问 [http://127.0.0.1:8080/admin/demo](http://127.0.0.1:8080/admin/demo) 接口。因为未登录,所以被 Spring Security 拦截到登录界面。如下图所示: 因为我们没有**自定义**登录界面,所以默认会使用 [DefaultLoginPageGeneratingFilter](https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authentication/ui/DefaultLoginPageGeneratingFilter.java) 类,生成上述界面。 输入我们在[「2.3 配置文件」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)中配置的「user/user」账号,进行登录。登录完成后,因为 Spring Security 会记录被拦截的访问地址,所以浏览器自动动跳转 [http://127.0.0.1:8080/admin/demo](http://127.0.0.1:8080/admin/demo) 接口。访问结果如下图所示: # 3\. 进阶使用 > 示例代码对应仓库:[lab-01-springsecurity-demo-role](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role) 。 在[「2. 快速入门」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)中,我们很**快速**的完成了 Spring Security 的入门。本小节,我们将会自定义 Spring Security 的配置,实现**权限控制**。 考虑到不污染上述的示例,我们新建一个 [lab-01-springsecurity-demo-role](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role) 项目。 ## 3.1 引入依赖 和 [「2.1 引入依赖」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#) 一致,见 [`pom.xml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-01-spring-security/lab-01-springsecurity-demo-role/pom.xml) 文件。 ## 3.2 示例一 在**示例一**中,我们会看看如何自定义 Spring Security 的配置,实现**权限控制**。 ### 3.2.1 SecurityConfig 在 [`cn.iocoder.springboot.lab01.springsecurity.config`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config) 包下,创建 [SecurityConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java) 配置类,继承 [WebSecurityConfigurerAdapter](https://github.com/spring-projects/spring-security/blob/master/config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.java) 抽象类,实现 Spring Security 在 Web 场景下的自定义配置。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Configuration</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SecurityConfig</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">WebSecurityConfigurerAdapter</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 我们可以通过重写 WebSecurityConfigurerAdapter 的方法,实现自定义的 Spring Security 的配置。 首先,我们重写 `#configure(AuthenticationManagerBuilder auth)` 方法,实现 [AuthenticationManager](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/AuthenticationManager.java) 认证管理器。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">configure</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(AuthenticationManagerBuilder auth)</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> Exception </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> auth.</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <X> 使用内存中的 InMemoryUserDetailsManager</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> inMemoryAuthentication()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Y> 不使用 PasswordEncoder 密码编码器</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .passwordEncoder(NoOpPasswordEncoder.getInstance())</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Z> 配置 admin 用户</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .withUser(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"admin"</span>).password(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"admin"</span>).roles(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"ADMIN"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Z> 配置 normal 用户</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .and().withUser(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"normal"</span>).password(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"normal"</span>).roles(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"NORMAL"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<X>` 处,调用 `AuthenticationManagerBuilder#inMemoryAuthentication()` 方法,使用**内存级别**的 [InMemoryUserDetailsManager](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/provisioning/InMemoryUserDetailsManager.java) Bean 对象,提供认证的用户信息。 - Spring 内置了两种 [UserDetailsManager](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/provisioning/UserDetailsManager.java) 实现: - InMemoryUserDetailsManager,和[「2. 快速入门」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)是一样的。 - JdbcUserDetailsManager ,基于 **JDBC**的 [JdbcUserDetailsManager](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/provisioning/JdbcUserDetailsManager.java) 。 - 实际项目中,我们更多采用调用 `AuthenticationManagerBuilder#userDetailsService(userDetailsService)` 方法,使用自定义实现的 [UserDetailsService](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/UserDetailsService.java) 实现类,更加**灵活**且**自由**的实现认证的用户信息的读取。 - `<Y>` 处,调用 `AbstractDaoAuthenticationConfigurer#passwordEncoder(passwordEncoder)` 方法,设置 PasswordEncoder 密码编码器。 - 在这里,为了方便,我们使用 [NoOpPasswordEncoder](https://github.com/spring-projects/spring-security/blob/master/crypto/src/main/java/org/springframework/security/crypto/password/NoOpPasswordEncoder.java) 。实际上,等于不使用 PasswordEncoder ,不配置的话会报错。 - 生产环境下,推荐使用 [BCryptPasswordEncoder](https://github.com/spring-projects/spring-security/blob/master/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoder.java) 。更多关于 PasswordEncoder 的内容,推荐阅读[《该如何设计你的 PasswordEncoder?》](http://www.iocoder.cn/Spring-Security/laoxu/PasswordEncoder/?self)文章。 - `<Z>` 处,配置了「admin/admin」和「normal/normal」两个用户,分别对应 ADMIN 和 NORMAL 角色。相比[「2. 快速入门」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)来说,可以配置更多的用户。 然后,我们重写 `#configure(HttpSecurity http)` 方法,主要配置 URL 的权限控制。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">configure</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpSecurity http)</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> Exception </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> http</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <X> 配置请求地址的权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .authorizeRequests()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/test/echo"</span>).permitAll() <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 所有用户可访问</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/test/admin"</span>).hasRole(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"ADMIN"</span>) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 需要 ADMIN 角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/test/normal"</span>).access(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"hasRole('ROLE_NORMAL')"</span>) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 需要 NORMAL 角色。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 任何请求,访问的用户都需要经过认证</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .anyRequest().authenticated()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .and()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Y> 设置 Form 表单登录</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .formLogin()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// .loginPage("/login") // 登录 URL 地址</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .permitAll() <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 所有用户可访问</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .and()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 配置退出相关</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .logout()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// .logoutUrl("/logout") // 退出 URL 地址</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .permitAll(); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 所有用户可访问</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<X>` 处,调用 `HttpSecurity#authorizeRequests()` 方法,开始配置 URL 的**权限控制**。注意看艿艿配置的**四个**权限控制的配置。下面,是配置权限控制会使用到的方法: - `#(String... antPatterns)` 方法,配置匹配的 URL 地址,基于 [Ant 风格路径表达式](https://blog.csdn.net/songdexv/article/details/7219686) ,可传入多个。 - 【常用】`#permitAll()` 方法,所有用户可访问。 - 【常用】`#denyAll()` 方法,所有用户不可访问。 - 【常用】`#authenticated()` 方法,登录用户可访问。 - `#anonymous()` 方法,无需登录,即匿名用户可访问。 - `#rememberMe()` 方法,通过 [remember me](https://docs.spring.io/spring-security/site/docs/3.0.x/reference/remember-me.html) 登录的用户可访问。 - `#fullyAuthenticated()` 方法,非 [remember me](https://docs.spring.io/spring-security/site/docs/3.0.x/reference/remember-me.html) 登录的用户可访问。 - `#hasIpAddress(String ipaddressExpression)` 方法,来自指定 IP 表达式的用户可访问。 - 【常用】`#hasRole(String role)` 方法, 拥有指定角色的用户可访问。 - 【常用】`#hasAnyRole(String... roles)` 方法,拥有指定任一角色的用户可访问。 - 【常用】`#hasAuthority(String authority)` 方法,拥有指定权限(`authority`)的用户可访问。 - 【常用】`#hasAuthority(String... authorities)` 方法,拥有指定任一权限(`authority`)的用户可访问。 - 【最牛】`#access(String attribute)` 方法,当 [Spring EL 表达式](https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html)的执行结果为 `true` 时,可以访问。 - `<Y>` 处,调用 `HttpSecurity#formLogin()` 方法,设置 Form 表单**登录**。 - 如果胖友想要自定义登录页面,可以通过 `#loginPage(String loginPage)` 方法,来进行设置。不过这里我们希望像[「2. 快速入门」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)一样,使用默认的登录界面,所以不进行设置。 - `<Z>` 处,调用 `HttpSecurity#logout()` 方法,配置**退出**相关。 - 如果胖友想要自定义退出页面,可以通过 `#logoutUrl(String logoutUrl)` 方法,来进行设置。不过这里我们希望像[「2. 快速入门」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)一样,使用默认的退出界面,所以不进行设置。 ### 3.2.2 TestController 在 [`cn.iocoder.springboot.lab01.springsecurity.controller`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller) 包路径下,创建 [TestController](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java) 类,提供测试 API 接口。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// TestController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RestController</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RequestMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/test"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">TestController</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/echo"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">demo</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"示例返回"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/home"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">home</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"我是首页"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/admin"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">admin</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"我是管理员"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/normal"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">normal</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"我是普通用户"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 对于 `/test/echo` 接口,直接访问,无需登录。 - 对于 `/test/home` 接口,无法直接访问,需要进行登录。 - 对于 `/test/admin` 接口,需要登录「admin/admin」用户,因为需要 ADMIN 角色。 - 对于 `/test/normal` 接口,需要登录「normal/normal」用户,因为需要 NORMAL 角色。 胖友可以按照如上的说明,进行各种测试。例如说,登录「normal/normal」用户后,去访问 `/test/admin` 接口,会返回 403 界面,无权限~ ## 3.3 示例二 在**示例二**中,我们会看看如何使用 Spring Security 的注解,实现权限控制。 ### 3.3.1 SecurityConfig 修改 [SecurityConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java) 配置类,增加 [`@EnableGlobalMethodSecurity`](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/method/configuration/EnableGlobalMethodSecurity.html) 注解,开启对 Spring Security 注解的方法,进行权限验证。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Configuration</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@EnableGlobalMethodSecurity</span>(prePostEnabled = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">true</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SecurityConfig</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">WebSecurityConfigurerAdapter</span></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 3.3.2 DemoController 在 [`cn.iocoder.springboot.lab01.springsecurity.controller`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller) 包路径下,创建 [DemoController](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java) 类,提供测试 API 接口。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// DemoController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RestController</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RequestMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/demo"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">DemoController</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@PermitAll</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/echo"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">demo</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"示例返回"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/home"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">home</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"我是首页"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@PreAuthorize</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"hasRole('ROLE_ADMIN')"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/admin"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">admin</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"我是管理员"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@PreAuthorize</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"hasRole('ROLE_NORMAL')"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/normal"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">normal</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"我是普通用户"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 每个 URL 的权限验证,和[「3.2.2 TestController」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)是一一对应的。 - [`@PermitAll`](https://github.com/jboss/jboss-annotations-api_spec/blob/master/src/main/java/javax/annotation/security/PermitAll.java) 注解,等价于 `#permitAll()` 方法,所有用户可访问。 > 重要!!!因为在[「3.2.1 SecurityConfig」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)中,配置了 `.anyRequest().authenticated()` ,任何请求,访问的用户都需要经过认证。所以这里 `@PermitAll` **注解实际是不生效的**。 > > 也就是说,Java Config 配置的权限,和注解配置的权限,两者是**叠加**的。 - [`@PreAuthorize`](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/access/prepost/PreAuthorize.java) 注解,等价于 `#access(String attribute)` 方法,,当 Spring EL 表达式的执行结果为 true 时,可以访问。 Spring Security 还有其它注解,不过不太常用,可见[《区别: @Secured(), @PreAuthorize() 及 @RolesAllowed()》](http://www.iocoder.cn/Fight/Differences-secure-preauthorize-and-rolesallowed/?self)文章。 胖友可以按照如上的说明,进行各种测试。例如说,登录「normal/normal」用户后,去访问 `/test/admin` 接口,会返回 403 界面,无权限~ # 4\. 整合 Spring Session 参见[《芋道 Spring Boot 分布式 Session 入门》](http://www.iocoder.cn/Spring-Boot/Distributed-Session/?self)文章的[「5. 整合 Spring Security」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)小节。 # 5\. 整合 OAuth2 参见[《芋道 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?self)文章,详细到爆炸。 # 6\. 整合 JWT 参见[《前后端分离 SpringBoot + SpringSecurity + JWT + RBAC 实现用户无状态请求验证》](http://www.iocoder.cn/Fight/Separate-SpringBoot-SpringSecurity-JWT-RBAC-from-front-and-rear-to-achieve-user-stateless-request-authentication/?self)文章,写的很不错。 # 7\. 项目实战 在开源项目翻了一圈,找到一个相对合适项目 [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 。主要以下几点原因: - 基于 Spring Security 实现。 - 基于 RBAC 权限模型,并且支持动态的权限配置。 - 基于 Redis 服务,实现登录用户的信息缓存。 - 前后端分离。同时前端采用 Vue ,相对来说后端会 Vue 的比 React 的多。 考虑到方便自己添加注释,艿艿 Fork 出一个仓库, 地址是 [https://github.com/YunaiV/RuoYi-Vue](https://github.com/YunaiV/RuoYi-Vue) 。 > 强烈推荐,生产级 Spring Security 项目实践,支持管理后台 + 用户 App 两种平台! > > 项目地址:[https://github.com/YunaiV/ruoyi-vue-pro](https://github.com/YunaiV/ruoyi-vue-pro) > > 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Activiti + Flowable 工作流、三方登录、支付、短信、商城等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 下面,来跟着艿艿一起走读下 RuoYi-Vue 的权限相关功能。 ## 7.1 表结构 基于 RBAC 权限模型,一共有 5 个表。 > 对 RBAC 权限模型不了解的胖友,可以看看[《到底什么是RBAC权限模型?!》](https://juejin.im/post/5d397e3ff265da1bca522011) > > 😈 嘻嘻,艿艿的大学毕业设计,做的就是统一认证中心,2011 年的时候,前后端分离。前端采用 [ExtJS](https://www.sencha.com/products/extjs/) 框架,后端自己参考 Spring Security 造的权限框架的轮子,提供 SDK 接入统一认证中心,使用 HTTP 通信。 | 实体 | 表 | 说明 | | --- | --- | --- | | SysUser | `sys_user` | 用户信息 | | SysRole | `sys_role` | 用户信息 | | SysUserRole | `sys_user_role` | 用户和角色关联 | | SysMenu | `sys_menu` | 菜单权限 | | SysRoleMenu | `sys_role_menu` | 角色和菜单关联 | 5 个表的关系比较简单: - 一个 SysUse ,可以拥有多个 SysRole ,通过 SysUserRole 存储关联。 - 一个 SysRole ,可以拥有多个 SysMenu ,通过 SysRoleMenu 存储关联。 ### 7.1.1 SysUser [SysUser](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysUser.java) ,用户实体类。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysUser.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SysUser</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">BaseEntity</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> serialVersionUID = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"用户序号"</span>, cellType = ColumnType.NUMERIC, prompt = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"用户编号"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long userId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"部门编号"</span>, type = Type.IMPORT)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long deptId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录名称"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String userName;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"用户名称"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String nickName;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"用户邮箱"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String email;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"手机号码"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String phonenumber;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"用户性别"</span>, readConverterExp = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"0=男,1=女,2=未知"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String sex;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 用户头像 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String avatar;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 密码 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String password;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 盐加密 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String salt;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"帐号状态"</span>, readConverterExp = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"0=正常,1=停用"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String status;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 删除标志(0代表存在 2代表删除) */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String delFlag;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"最后登录IP"</span>, type = Type.EXPORT)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String loginIp;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"最后登录时间"</span>, width = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">30</span>, dateFormat = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"yyyy-MM-dd HH:mm:ss"</span>, type = Type.EXPORT)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Date loginDate;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excels</span>({</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"部门名称"</span>, targetAttr = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"deptName"</span>, type = Type.EXPORT),</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"部门负责人"</span>, targetAttr = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"leader"</span>, type = Type.EXPORT)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> })</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysDept dept;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 角色对象 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> List<SysRole> roles;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 角色组 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long[] roleIds;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 岗位组 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long[] postIds;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 添加 `@Transient` 注解的字段,非存储字段。后续的实体,补充重复赘述。 - 每个字段比较简单,胖友自己根据注释理解下即可。 对应表的创建 SQL 如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">create</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">table</span> sys_user (</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> user_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> auto_increment <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> dept_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'部门ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> user_name <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">30</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户账号'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> nick_name <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">30</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户昵称'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> user_type <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">2</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'00'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户类型(00系统用户)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> email <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户邮箱'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> phonenumber <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">11</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'手机号码'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> sex <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'0'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户性别(0男 1女 2未知)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> avatar <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'头像地址'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">password</span> <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'密码'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">status</span> <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'0'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'帐号状态(0正常 1停用)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> del_flag <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'0'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'删除标志(0代表存在 2代表删除)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> login_ip <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'最后登录IP'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> login_date datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'最后登录时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> create_by <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">64</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'创建者'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> create_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'创建时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> update_by <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">64</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'更新者'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> update_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'更新时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> remark <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">500</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'备注'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> primary <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">key</span> (user_id)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">engine</span>=<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">innodb</span> auto_increment=<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户信息表'</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 7.1.2 SysRole [SysRole](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysRole.java) ,角色实体类。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysRole.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SysRole</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">BaseEntity</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> serialVersionUID = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"角色序号"</span>, cellType = ColumnType.NUMERIC)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long roleId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"角色名称"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String roleName;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"角色权限"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String roleKey;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"角色排序"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String roleSort;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"数据范围"</span>, readConverterExp = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String dataScope;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"角色状态"</span>, readConverterExp = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"0=正常,1=停用"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String status;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 删除标志(0代表存在 2代表删除) */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String delFlag;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 用户是否存在此角色标识 默认不存在 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> flag = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 菜单组 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long[] menuIds;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 部门组(数据权限) */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long[] deptIds;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 每个字段比较简单,胖友自己根据注释理解下即可。 对应表的创建 SQL 如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">create</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">table</span> sys_role (</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> role_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> auto_increment <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> role_name <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">30</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色名称'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> role_key <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色权限字符串'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> role_sort <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">int</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">4</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'显示顺序'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> data_scope <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'1'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">status</span> <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色状态(0正常 1停用)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> del_flag <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'0'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'删除标志(0代表存在 2代表删除)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> create_by <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">64</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'创建者'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> create_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'创建时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> update_by <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">64</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'更新者'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> update_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'更新时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> remark <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">500</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'备注'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> primary <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">key</span> (role_id)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">engine</span>=<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">innodb</span> auto_increment=<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色信息表'</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 7.1.3 SysUserRole [SysUserRole](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysUserRole.java) ,用户和角色关联实体类。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysUserRole.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SysUserRole</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 用户ID */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long userId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 角色ID */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long roleId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 每个字段比较简单,胖友自己根据注释理解下即可。 - `roleKey` 属性,对应的角色**标识**字符串,可以对应多个角色**标识**,使用逗号分隔。例如说:`"admin,normal"` 。 对应表的创建 SQL 如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">create</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">table</span> sys_user_role (</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> user_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> role_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> primary <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">key</span>(user_id, role_id)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">engine</span>=<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">innodb</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户和角色关联表'</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 7.1.4 SysMenu [SysMenu](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysMenu.java) ,菜单权限实体类。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysMenu.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SysMenu</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">BaseEntity</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> serialVersionUID = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 菜单ID */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long menuId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 菜单名称 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String menuName;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 父菜单名称 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String parentName;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 父菜单ID */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long parentId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 显示顺序 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String orderNum;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 路由地址 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String path;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 组件路径 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String component;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 是否为外链(0是 1否) */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String isFrame;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 类型(M目录 C菜单 F按钮) */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String menuType;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 菜单状态:0显示,1隐藏 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String visible;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 权限字符串 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String perms;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 菜单图标 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String icon;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 子菜单 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Transient</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> List<SysMenu> children = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> ArrayList<SysMenu>();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 😈 个人感觉,这个实体改成 SysResource 资源,更加合适,菜单仅仅是其中的一种。 - 每个字段比较简单,胖友自己根据资源理解下即可。我们来重点看几个字段。 - `menuType` 属性,定义了三种类型。其中,`F` 代表按钮,是为了做页面中的功能级的权限。 - `perms` 属性,对应的权限**标识**字符串。一般格式为 `${大模块}:${小模块}:{操作}` 。示例如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">用户查询:system:user:query</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">用户新增:system:user:add</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">用户修改:system:user:edit</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">用户删除:system:user:remove</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">用户导出:system:user:<span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">export</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">用户导入:system:user:import</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">重置密码:system:user:resetPwd</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 对于前端来说,每个按钮在展示时,可以判断用户是否有该按钮的权限。如果没有,则进行隐藏。当然,前端在首次进入系统的时候,会请求一次权限列表到本地进行缓存。 - 对于后端来说,每个接口上会添加 `@PreAuthorize("@ss.hasPermi('system:user:list')")` 注解。在请求接口时,会校验用户是否有该 URL 对应的权限。如果没有,则会抛出权限验证失败的异常。 - 一个 `perms` 属性,可以对应多个权限**标识**,使用逗号分隔。例如说:`"system:user:query,system:user:add"` 。 对应表的创建 SQL 如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">create</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">table</span> sys_menu (</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> menu_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> auto_increment <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> menu_name <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单名称'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> parent_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">0</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'父菜单ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> order_num <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">int</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">4</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">0</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'显示顺序'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">path</span> <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">200</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'路由地址'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> component <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">255</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'组件路径'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> is_frame <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">int</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'是否为外链(0是 1否)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> menu_type <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单类型(M目录 C菜单 F按钮)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">visible</span> <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">0</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单状态(0显示 1隐藏)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> perms <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'权限标识'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> icon <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'#'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单图标'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> create_by <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">64</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'创建者'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> create_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'创建时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> update_by <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">64</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'更新者'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> update_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'更新时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> remark <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">500</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'备注'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> primary <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">key</span> (menu_id)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">engine</span>=<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">innodb</span> auto_increment=<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">2000</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单权限表'</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 7.1.5 SysRoleMenu [SysRoleMenu](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysRoleMenu.java) ,菜单权限实体类。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysRoleMenu.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SysRoleMenu</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 角色ID */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long roleId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 菜单ID */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long menuId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 每个字段比较简单,胖友自己根据注释理解下即可。 对应表的创建 SQL 如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">create</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">table</span> sys_role_menu (</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> role_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> menu_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'菜单ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> primary <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">key</span>(role_id, menu_id)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">engine</span>=<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">innodb</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'角色和菜单关联表'</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ## 7.2 SecurityConfig 在 [SecurityConfig](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java) 配置类,继承 WebSecurityConfigurerAdapter 抽象类,实现 Spring Security 在 Web 场景下的自定义配置。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Configuration</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SecurityConfig</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">WebSecurityConfigurerAdapter</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 涉及到的配置方法较多,我们逐个来看看。 重写 `#configure(AuthenticationManagerBuilder auth)` 方法,实现 [AuthenticationManager](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/AuthenticationManager.java) 认证管理器。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 自定义用户认证逻辑</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> UserDetailsService userDetailsService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 身份认证接口</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">configure</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(AuthenticationManagerBuilder auth)</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> Exception </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> auth.userDetailsService(userDetailsService) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <X></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .passwordEncoder(bCryptPasswordEncoder()); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Y></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 强散列哈希加密实现</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Bean</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> BCryptPasswordEncoder <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">bCryptPasswordEncoder</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> BCryptPasswordEncoder();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<X>` 处,调用 `AuthenticationManagerBuilder#userDetailsService(userDetailsService)` 方法,使用自定义实现的 [UserDetailsService](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/UserDetailsService.java) 实现类,更加**灵活**且**自由**的实现认证的用户信息的读取。在[「7.3.1 加载用户信息」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)中,我们会看到 RuoYi-Vue 对 UserDetailsService 的自定义实现类。 - `<Y>` 处,调用 `AbstractDaoAuthenticationConfigurer#passwordEncoder(passwordEncoder)` 方法,设置 PasswordEncoder 密码编码器。这里,就使用了 bCryptPasswordEncoder 强散列哈希加密实现。 重写 `#configure(HttpSecurity httpSecurity)` 方法,主要配置 URL 的权限控制。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 认证失败处理类</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> AuthenticationEntryPointImpl unauthorizedHandler;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 退出处理类</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> LogoutSuccessHandlerImpl logoutSuccessHandler;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * token 认证过滤器</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> JwtAuthenticationTokenFilter authenticationTokenFilter;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">configure</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpSecurity httpSecurity)</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> Exception </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> httpSecurity</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// CRSF禁用,因为不使用session</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .csrf().disable()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <X> 认证失败处理类</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 基于token,所以不需要session</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 过滤请求</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .authorizeRequests()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Y> 对于登录login 验证码captchaImage 允许匿名访问</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/login"</span>, <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/captchaImage"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> HttpMethod.GET,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/*.html"</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/**/*.html"</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/**/*.css"</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/**/*.js"</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ).permitAll()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/profile/**"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/common/download**"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/swagger-ui.html"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/swagger-resources/**"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/webjars/**"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/*/api-docs"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .antMatchers(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/druid/**"</span>).anonymous()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 除上面外的所有请求全部需要鉴权认证</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .anyRequest().authenticated()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .and()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .headers().frameOptions().disable();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> httpSecurity.logout().logoutUrl(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/logout"</span>).logoutSuccessHandler(logoutSuccessHandler); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <Z></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <P> 添加 JWT filter</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 比较长,我们选择重点的来看。 - `<X>` 处,设置认证失败时的处理器为 `unauthorizedHandler` 。详细解析,见[「7.6.1 AuthenticationEntryPointImpl」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)。 - `<Y>` 处,设置用于登录的 `/login` 接口,允许匿名访问。这样,后续我们就可以使用自定义的登录接口。详细解析,见[「7.3 登录 API 接口」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)。 - `<Z>` 处,设置登出成功的处理器为 `logoutSuccessHandler` 。详细解析,见[「7.6.3 LogoutSuccessHandlerImpl」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)。 - `<P>` 处,添加 JWT 认证过滤器 `authenticationTokenFilter` ,用于用户使用用户名与密码登录完成后,后续请求基于 JWT 来认证。 详细解析,见[「7.4 JwtAuthenticationTokenFilter」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)。 重写 `#authenticationManagerBean` 方法,解决无法直接注入 AuthenticationManager 的问题。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SecurityConfig.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Bean</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AuthenticationManager <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">authenticationManagerBean</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> Exception </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">super</span>.authenticationManagerBean();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 在方法上,额外添加了 `@Bean` 注解,保证创建出 AuthenticationManager Bean 。 下面,我们详细的来看看,各个配置的 Bean 的逻辑。 ## 7.3 登录 API 接口 **SysLoginController#login(...)** 在 [SysLoginController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java) 中,定义了 `/login` 接口,提供登录功能。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysLoginController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysLoginService loginService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 登录方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> username 用户名</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> password 密码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> code 验证码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> uuid 唯一标识</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 结果</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@PostMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/login"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AjaxResult <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">login</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String username, String password, String code, String uuid)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AjaxResult ajax = AjaxResult.success();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 生成令牌</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String token = loginService.login(username, password, code, uuid);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ajax.put(Constants.TOKEN, token);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> ajax;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 在内部,会调用 `loginService#login(username, password, code, uuid)` 方法,会进行基于用户名与密码的登录认证。认证通过后,返回身份 TOKEN 。 - 登录成功后,该接口响应示例如下 <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">"msg"</span>: <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"操作成功"</span>, </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">"code"</span>: <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">200</span>, </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="attr" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">"token"</span>: <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImJkN2Q4OTZiLTU2NTAtNGIyZS1iNjFjLTc0MjlkYmRkNzA1YyJ9.lkU8ot4GecLHs7VAcRAo1fLMOaFryd4W5Q_a2wzPwcOL0Kiwyd4enpnGd79A_aQczXC-JB8vELNcNn7BrtJn9A"</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 后续,前端在请求后端接口时,在请求头上带头该 `token` 值,作为用户身份标识。 **SysLoginService#login(...)** 在 [`SysLoginService`](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java) 中,定义了 `#login(username, password, code, uuid)` 方法,进行基于用户名与密码的登录认证。认证通过后,返回身份 TOKEN 。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysLoginService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> TokenService tokenService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Resource</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> AuthenticationManager authenticationManager;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> RedisCache redisCache;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 登录验证</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> username 用户名</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> password 密码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> code 验证码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> uuid 唯一标识</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 结果</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">login</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String username, String password, String code, String uuid)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1> 验证图片验证码的正确性</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// uuid 的作用,是获得对应的图片验证码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String captcha = redisCache.getCacheObject(verifyKey); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 从 Redis 中,获得图片验证码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> redisCache.deleteObject(verifyKey); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 从 Redis 中,删除图片验证码</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (captcha == <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">null</span>) { <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 图片验证码不存在</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"user.jcaptcha.error"</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> CaptchaExpireException();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (!code.equalsIgnoreCase(captcha)) { <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 图片验证码不正确</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"user.jcaptcha.expire"</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> CaptchaException();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2> 用户验证</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> Authentication authentication;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">try</span> {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 该方法会去调用 UserDetailsServiceImpl.loadUserByUsername</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> authentication = authenticationManager</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .authenticate(<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> UsernamePasswordAuthenticationToken(username, password));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> } <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">catch</span> (Exception e) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2.1> 发生异常,说明验证不通过,记录相应的登录失败日志</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (e <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">instanceof</span> BadCredentialsException) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"user.password.not.match"</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> UserPasswordNotMatchException();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> } <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">else</span> {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> CustomException(e.getMessage());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2.2> 验证通过,记录相应的登录成功日志</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"user.login.success"</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <3> 生成 Token</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = (LoginUser) authentication.getPrincipal();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> tokenService.createToken(loginUser);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<1>` 处,验证图片验证码的正确性。该验证码会存储在 Redis 缓存中,通过 `uuid` 作为对应的标识。生成的逻辑,胖友自己看 [CaptchaController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/common/CaptchaController.java) 提供的 `/captchaImage` 接口。 - `<2>` 处,调用 Spring Security 的 **AuthenticationManager** 的 `#authenticate(UsernamePasswordAuthenticationToken authentication)` 方法,基于用户名与密码的登录认证。在其内部,会调用我们定义的 UserDetailsServiceImpl 的 `#loadUserByUsername(String username)` 方法,获得指定用户名对应的用户信息。详细解析,见[「7.3.1 加载用户信息」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)。 - `<2.1>` 处,发生异常,说明认证**不**通过,记录相应的登录失败日志。 - `<2.2>` 处,**未**发生异常,说明认证通过,记录相应的登录成功日志。 - 关于上述日志,我们在[「7.7 登录日志」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)来讲。 - `<3>` 处,调用 TokenService 的 `#createToken(LoginUser loginUser)` 方法,给认证通过的用户,生成其对应的认证 TOKEN 。这样,该用户的后续请求,就使用该 TOKEN 作为身份标识进行认证。 ### 7.3.1 加载用户信息 在 [UserDetailsServiceImpl](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/service/UserDetailsServiceImpl.java) 中,实现 Spring Security [UserDetailsService](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/UserDetailsService.java) 接口,实现了该接口定义的 `#loadUserByUsername(String username)` 方法,获得指定用户名对应的用户信息。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// UserDetailsServiceImpl.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> ISysUserService userService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysPermissionService permissionService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> UserDetails <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">loadUserByUsername</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String username)</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> UsernameNotFoundException </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1> 查询指定用户名对应的 SysUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> SysUser user = userService.selectUserByUserName(username);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2> 各种校验</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNull(user)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> log.info(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录用户:{} 不存在."</span>, username);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> UsernameNotFoundException(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录用户:"</span> + username + <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">" 不存在"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> } <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">else</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> log.info(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录用户:{} 已被删除."</span>, username);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> BaseException(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"对不起,您的账号:"</span> + username + <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">" 已被删除"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> } <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">else</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (UserStatus.DISABLE.getCode().equals(user.getStatus())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> log.info(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录用户:{} 已被停用."</span>, username);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throw</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> BaseException(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"对不起,您的账号:"</span> + username + <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">" 已停用"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <3> 创建 Spring Security UserDetails 用户明细</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> createLoginUser(user);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> UserDetails <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">createLoginUser</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(SysUser user)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> LoginUser(user, permissionService.getMenuPermission(user));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<1>` 处,调用 ISysUserService 的 `#selectUserByUserName(String userName)` 方法,查询指定用户名对应的 SysUser 。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysUserServiceImpl.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysUserMapper userMapper;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> SysUser <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">selectUserByUserName</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(String userName)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> userMapper.selectUserByUserName(userName);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysUserMapper.XML</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><sql id=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectUserVo"</span>></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> from sys_user u</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_dept d on u.dept_id = d.dept_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_user_role ur on u.user_id = ur.user_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_role r on r.role_id = ur.role_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></sql></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><select id=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectUserByUserName"</span> parameterType=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"String"</span> resultMap=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"SysUserResult"</span>></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <include refid=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectUserVo"</span>/></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> where u.user_name = #{userName}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></select></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 通过查询 `sys_user` 表,同时连接 `sys_dept`、`sys_user_role`、`sys_role` 表,将 `username` 对应的 SysUser 相关信息都一次性查询出来。 - 返回结果 `SysUserResult` 的具体定义,点击 [传送门](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/resources/mybatis/system/SysUserMapper.xml#L7-L46) 查看,实际就是 SysUser 实体类。 - `<2>` 处,各种校验。如果校验不通过,抛出 UsernameNotFoundException 或 BaseException 异常。 - `<3>` 处,调用 SysPermissionService 的 `#getMenuPermission(SysUser user)` 方法,获得用户的 SysRoleMenu 的权限**标识**字符串的集合。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysPermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> ISysMenuService menuService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> Set<String> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">getMenuPermission</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(SysUser user)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> Set<String> roles = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> HashSet<String>();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 管理员拥有所有权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (user.isAdmin()) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> roles.add(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"*:*:*"</span>); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 所有模块</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> } <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">else</span> {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 读取</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> roles.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> roles;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysMenuServiceImpl.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysMenuMapper menuMapper;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> Set<String> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">selectMenuPermsByUserId</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(Long userId)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 读取 SysMenu 的权限标识数组</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> List<String> perms = menuMapper.selectMenuPermsByUserId(userId);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 逐个,按照“逗号”分隔</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> Set<String> permsSet = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> HashSet<>();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">for</span> (String perm : perms) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotEmpty(perm)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> permsSet.addAll(Arrays.asList(perm.trim().split(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">","</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> permsSet;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysMenuMapper.xml</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><select id=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectMenuPermsByUserId"</span> parameterType=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"Long"</span> resultType=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"String"</span>></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> select distinct m.perms</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> from sys_menu m</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_role_menu rm on m.menu_id = rm.menu_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_user_role ur on rm.role_id = ur.role_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> where ur.user_id = #{userId}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></select></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 虽然代码很长,但是核心的并不多。 - 首先,如果 SysUser 是超级管理员,则其权限标识集合就是 `*:*:*` ,标识可以所有模块的所有操作。 - 然后,查询 `sys_menu` 表,同时连接 `sys_role_menu`、`sys_user_role` 表,将 SysUser 拥有的 SysMenu 的权限标识数组,然后使用 `","` 分隔每个 SysMenu 对应的权限标识。 这里,我们看到最终返回的是 [LoginUser](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/LoginUser.java) ,实现 Spring Security [UserDetails](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/UserDetails.java) 接口,自定义的用户明细。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// LoginUser.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">LoginUser</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">implements</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">UserDetails</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> serialVersionUID = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 用户唯一标识 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String token;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 登录时间 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long loginTime;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 过期时间 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long expireTime;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 登录IP地址 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String ipaddr;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 登录地点 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String loginLocation;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 浏览器类型 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String browser;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 操作系统 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String os;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 权限列表 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Set<String> permissions;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/** 用户信息 */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysUser user;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法,以及各种实现方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 7.3.2 创建认证 Token 在 [TokenService](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/service/TokenService.java) 中,定义了 `#createToken(LoginUser loginUser)` 方法,给认证通过的用户,生成其对应的认证 Token 。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 创建令牌</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> loginUser 用户信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 令牌</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">createToken</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(LoginUser loginUser)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1> 设置 LoginUser 的用户唯一标识。注意,这里虽然变量名叫 token ,其实不是身份认证的 Token</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String token = IdUtils.fastUUID();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> loginUser.setToken(token);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2> 设置用户终端相关的信息,包括 IP、城市、浏览器、操作系统</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> setUserAgent(loginUser);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <3> 记录缓存</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> refreshToken(loginUser);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <4> 生成 JWT 的 Token</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> Map<String, Object> claims = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> HashMap<>();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> claims.put(Constants.LOGIN_USER_KEY, token);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> createToken(claims);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 注意,这个方法不仅仅会生成认证 Token ,还会缓存 LoginUser 到 Redis 缓存中。 - `<1>` 处,设置 LoginUser 的用户唯一标识,即 `LoginUser.token`。注意,这里虽然变量名叫 `token` ,其实不是身份认证的 Token 。 - `<2>` 处,调用 `#setUserAgent(LoginUser loginUser)` 方法,设置用户终端相关的信息,包括 IP、城市、浏览器、操作系统。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">setUserAgent</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(LoginUser loginUser)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"User-Agent"</span>));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String ip = IpUtils.getIpAddr(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setIpaddr(ip);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setBrowser(userAgent.getBrowser().getName());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setOs(userAgent.getOperatingSystem().getName());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<3>` 处,调用 `#refreshToken(LoginUser loginUser)` 方法,缓存 LoginUser 到 Redis 缓存中。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// application.yaml</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"># token配置</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">token:</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> # 令牌有效期(默认30分钟)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> expireTime: <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">30</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// Constants.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 登录用户 redis key</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> String LOGIN_TOKEN_KEY = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"login_tokens:"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 令牌有效期(默认30分钟)</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Value</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"${token.expireTime}"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">int</span> expireTime;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> RedisCache redisCache;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">refreshToken</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(LoginUser loginUser)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setLoginTime(System.currentTimeMillis());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 根据 uuid 将 loginUser 缓存</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String userKey = getTokenKey(loginUser.getToken());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">getTokenKey</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(String uuid)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> Constants.LOGIN_TOKEN_KEY + uuid;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 缓存的 Redis Key 的**统一前缀**为 `"login_tokens:"` ,使用 Login 的用户唯一标识(`LoginUser.token`)作为**后缀**。 - `<4>` 处,调用 `#createToken(Map<String, Object> claims)` 方法,生成 JWT 的 Token 。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// application.yaml</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"># token配置</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">token:</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> # 令牌秘钥</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> secret: abcdefghijklmnopqrstuvwxyz</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 令牌秘钥</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Value</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"${token.secret}"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String secret;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">createToken</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(Map<String, Object> claims)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> Jwts.builder()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> .setClaims(claims)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> .signWith(SignatureAlgorithm.HS512, secret).compact();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 这里,我们采用了 [`jjwt`](https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt) 库。 - 对 JWT 不了解的胖友,可以阅读下[《JSON Web Token - 在Web应用间安全地传递信息》](http://www.iocoder.cn/Fight/understanding-jwt/?self)和[《八幅漫画理解使用 JSON Web Token 设计单点登录系统》](http://www.iocoder.cn/Fight/user-authentication-with-jwt/?self)文章。 - **注意**,不要把这里生成的 JWT 的 Token ,和我们上面的 `LoginUser.token` 混淆在一起。 - 因为 `LoginUser.token` 添加到 `claims` 中,最终生成了 JWT 的 Token 。所以,后续我们可以通过解码该 JWT 的 Token ,从而获得 `claims` ,最终获得到对应的 `LoginUser.token` 。 - 在 JWT 的 Token 中,使用 `LoginUser.token` 而不是 `userId` 的好处,可以带来更好的安全性,避免万一 `secret` 秘钥泄露之后,黑客可以顺序生成 `userId` 从而生成对应的 JWT 的 Token ,后续直接可以操作该用户的数据。不过,这么做之后就不是**纯粹**的 JWT ,解析出来的 `LoginUser.token` 需要查询对应的 LoginUser 的 Redis 缓存。详细的,我们在[「7.4 JwtAuthenticationTokenFilter」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)会看到这个过程。 至此,我们完成了基于用户名与密码的登录认证的整个过程。虽然整个过程的代码有小几百行,不过逻辑还是比较清晰明了的。如果不太理解的胖友,可以在反复看两遍。 ## 7.4 JwtAuthenticationTokenFilter 在 [JwtAuthenticationTokenFilter](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java) 中,继承 [OncePerRequestFilter](https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/web/filter/OncePerRequestFilter.java) 过滤器,实现了基于 Token 的认证。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// JwtAuthenticationTokenFilter.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Component</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">JwtAuthenticationTokenFilter</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">OncePerRequestFilter</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> TokenService tokenService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">doFilterInternal</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpServletRequest request, HttpServletResponse response, FilterChain chain)</span></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">throws</span> ServletException, IOException </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1> 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(request);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果存在 LoginUser ,并且未认证过</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2> 校验 Token 有效性</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> tokenService.verifyToken(loginUser);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <3> 创建 UsernamePasswordAuthenticationToken 对象,设置到 SecurityContextHolder 中</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> UsernamePasswordAuthenticationToken authenticationToken = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> UsernamePasswordAuthenticationToken(loginUser, <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">null</span>, loginUser.getAuthorities());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> authenticationToken.setDetails(<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> WebAuthenticationDetailsSource().buildDetails(request));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> SecurityContextHolder.getContext().setAuthentication(authenticationToken);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <4> 继续过滤器</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> chain.doFilter(request, response);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<1>` 处,调用 TokenService 的 `#getLoginUser(request)` 方法,获得当前 LoginUser 。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// application.yaml</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"># token配置</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">token:</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> # 令牌自定义标识</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> header: Authorization</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.jav</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 令牌自定义标识</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Value</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"${token.header}"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String header;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 获取用户身份信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@return</span> 用户信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> LoginUser <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">getLoginUser</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpServletRequest request)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1.1> 获取请求携带的令牌</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String token = getToken(request);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotEmpty(token)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1.2> 解析 JWT 的 Token</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> Claims claims = parseToken(token);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1.3> 从 Redis 缓存中,获得对应的 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String userKey = getTokenKey(uuid);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> redisCache.getCacheObject(userKey);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">null</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">getToken</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpServletRequest request)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String token = request.getHeader(header);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> token = token.replace(Constants.TOKEN_PREFIX, <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">""</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> token;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Claims <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">parseToken</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(String token)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> Jwts.parser()</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> .setSigningKey(secret)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> .parseClaimsJws(token)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> .getBody();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<1.1>` 处,调用 `#getToken(request)` 方法,从请求头 `"Authorization"` 中,获得身份认证的 Token 。 - `<1.2>` 处,调用 `#parseToken(token)` 方法,解析 JWT 的 Token ,获得 Claims 对象,从而获得用户唯一标识(`LoginUser.token`)。 - `<1.3>` 处,从 Redis 缓存中,获得对应的 LoginUser 。 - `<2>` 处,调用 TokenService 的 `#verifyToken(LoginUser loginUser)` 方法,验证令牌有效期。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> MILLIS_SECOND = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">1000</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">protected</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> MILLIS_MINUTE = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">60</span> * MILLIS_SECOND;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> Long MILLIS_MINUTE_TEN = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span> * <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">60</span> * <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">1000L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 验证令牌有效期,相差不足 20 分钟,自动刷新缓存</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@param</span> loginUser 用户</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">verifyToken</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(LoginUser loginUser)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> expireTime = loginUser.getExpireTime();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> currentTime = System.currentTimeMillis();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 相差不足 20 分钟,自动刷新缓存</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (expireTime - currentTime <= MILLIS_MINUTE_TEN) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String token = loginUser.getToken();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> loginUser.setToken(token);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> refreshToken(loginUser);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 实际上,这个方法的目的不是验证 Token 的有效性,而是刷新对应的 LoginUser 的缓存的过期时间。 - 考虑到避免每次请求都去刷新缓存的过期时间,所以过期时间不足 20 分钟,才会去刷新。 - `<3>` 处,**手动**创建 UsernamePasswordAuthenticationToken 对象,设置到 SecurityContextHolder 中。😈 因为,我们已经通过 Token 来完成认证了。 - `<4>` 处,继续过滤器。 严格来说,RuoYi-Vue 并不是采用的**无状态**的 JWT ,而是使用 JWT 的 Token 的生成方式。 ## 7.5 权限验证 在[「3. 进阶使用」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)中,我们看到可以通过 Spring Security 提供的 `@PreAuthorize` 注解,实现基于 Spring EL 表达式的执行结果为 `true` 时,可以访问,从而实现灵活的权限校验。 在 RuoYi-Vue 中,通过 `@PreAuthorize` 注解的特性,使用其 [PermissionService](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/service/PermissionService.java) 提供的权限验证的方法。使用示例如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysDictDataController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@PreAuthorize</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"@ss.hasPermi('system:dict:list')"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"/list"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 请求 `/system/dict/data/list` 接口,会调用 PermissionService 的 `#hasPermi(String permission)` 方法,校验用户是否有指定的权限。 - 为什么这里会有一个 `@ss` 呢?在 Spring EL 表达式中,调用指定 Bean 名字的方法时,使用 `@` \+ Bean 的名字。在 RuoYi-Vue 中,声明 PermissionService 的 Bean 名字为 `ss` 。 ### 7.5.1 判断是否有权限 在 PermissionService 中,定义了 `#hasPermi(String permission)` 方法,判断当前用户是否**有**指定的权限。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// PermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 所有权限标识</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> String ALL_PERMISSION = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"*:*:*"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> TokenService tokenService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 验证用户是否具备某权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> permission 权限字符串</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否具备某权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">hasPermi</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String permission)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果未设置需要的权限,强制不具备。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isEmpty(permission)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果不存在,或者没有任何权限,说明权限验证不通过</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 判断是否包含权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> hasPermissions(loginUser.getPermissions(), permission);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 判断是否包含权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> permissions 权限列表</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> permission 权限字符串</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否具备某权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">hasPermissions</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(Set<String> permissions, String permission)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 比较简单,胖友看看艿艿添加的代码注释,就能够明白。 在 PermissionService 中,定义了 `#lacksPermi(String permission)` 方法,判断当前用户是否**没有**指定的权限。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// PermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 验证用户是否不具备某权限,与 hasPermi逻辑相反</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> permission 权限字符串</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否不具备某权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">lacksPermi</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String permission)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> !hasPermi(permission);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> 在 PermissionService 中,定义了 `#hasAnyPermi(String permissions)` 方法,判断当前用户是否**有**指定的**任一**权限。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// PermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> String PERMISSION_DELIMETER = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">","</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 验证用户是否具有以下任意一个权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否具有以下任意一个权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">hasAnyPermi</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String permissions)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果未设置需要的权限,强制不具备。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isEmpty(permissions)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果不存在,或者没有任何权限,说明权限验证不通过</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 判断是否包含指定的任一权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> Set<String> authorities = loginUser.getPermissions();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">for</span> (String permission : permissions.split(PERMISSION_DELIMETER)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (permission != <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">null</span> && hasPermissions(authorities, permission)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">true</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ### 7.5.2 判断是否有角色 在 PermissionService 中,定义了 `#hasRole(String role)` 方法,判断当前用户是否**有**指定的角色。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// PermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 判断用户是否拥有某个角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> role 角色字符串</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否具备某角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">hasRole</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String role)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果未设置需要的角色,强制不具备。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isEmpty(role)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果不存在,或者没有任何角色,说明权限验证不通过</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 判断是否包含指定角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">for</span> (SysRole sysRole : loginUser.getUser().getRoles()) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String roleKey = sysRole.getRoleKey();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (SUPER_ADMIN.contains(roleKey) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 超级管理员的特殊处理</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> || roleKey.contains(StringUtils.trim(role))) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">true</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 比较简单,胖友看看艿艿添加的代码注释,就能够明白。 在 PermissionService 中,定义了 `#lacksRole(String role)` 方法,判断当前用户是否**没有**指定的角色。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// PermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 验证用户是否不具备某角色,与 isRole逻辑相反。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> role 角色名称</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否不具备某角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">lacksRole</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String role)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> !hasRole(role);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> 在 PermissionService 中,定义了 `#hasAnyRoles(String roles)` 方法,判断当前用户是否**有**指定的**任一**角色。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// PermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> String ROLE_DELIMETER = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">","</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 验证用户是否具有以下任意一个角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@param</span> roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户是否具有以下任意一个角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">boolean</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">hasAnyRoles</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(String roles)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果未设置需要的角色,强制不具备。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isEmpty(roles)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果不存在,或者没有任何角色,说明权限验证不通过</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 判断是否包含指定的任一角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">for</span> (String role : roles.split(ROLE_DELIMETER)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (hasRole(role)) { <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 这里实现有点问题,会循环调用 hasRole 方法,重复从 Redis 中读取当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">true</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">false</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ## 7.6 各种处理器 在 Ruoyi-Vue 中,提供了各种处理器,处理各种情况,所以我们汇总在[「7.6 各种处理器」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#) 中,一起来瞅瞅。 ### 7.6.1 AuthenticationEntryPointImpl 在 [AuthenticationEntryPointImpl](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java) 中,实现 Spring Security [AuthenticationEntryPoint](https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/AuthenticationEntryPoint.java) 接口,处理认失败的 [AuthenticationException](https://github.com/spring-projects/spring-security/blob/master/core/src/main/java/org/springframework/security/core/AuthenticationException.java) 异常。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// AuthenticationEntryPointImpl.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 认证失败处理类 返回未授权</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Component</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">AuthenticationEntryPointImpl</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">implements</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">AuthenticationEntryPoint</span>, <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">Serializable</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> serialVersionUID = -<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">8970718410437077606L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">commence</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 响应认证不通过</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">int</span> code = HttpStatus.UNAUTHORIZED;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String msg = StringUtils.format(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"请求访问:{},认证失败,无法访问系统资源"</span>, request.getRequestURI());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 响应认证不通过的 JSON 字符串。 ### 7.6.2 GlobalExceptionHandler 在 [GlobalExceptionHandler](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java) 中,定义了对 Spring Security 的异常处理。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// GlobalExceptionHandler.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@RestControllerAdvice</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">GlobalExceptionHandler</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@ExceptionHandler</span>(AccessDeniedException.class) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 没有访问权限。使用 @PreAuthorize 校验权限不通过时,就会抛出 AccessDeniedException 异常</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AjaxResult <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">handleAuthorizationException</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(AccessDeniedException e)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> log.error(e.getMessage());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> AjaxResult.error(HttpStatus.FORBIDDEN, <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"没有权限,请联系管理员授权"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@ExceptionHandler</span>(AccountExpiredException.class) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 账号已过期</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AjaxResult <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">handleAccountExpiredException</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(AccountExpiredException e)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> log.error(e.getMessage(), e);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> AjaxResult.error(e.getMessage());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@ExceptionHandler</span>(UsernameNotFoundException.class) <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 用户名不存在</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AjaxResult <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">handleUsernameNotFoundException</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(UsernameNotFoundException e)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> log.error(e.getMessage(), e);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> AjaxResult.error(e.getMessage());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ... 省略对其它的异常类的处理的方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 基于 Spring MVC 提供的 `@RestControllerAdvice` + `@ExceptionHandler` 注解,实现全局异常的处理。不了解的胖友,可以看看[《芋道 Spring Boot SpringMVC 入门》](http://www.iocoder.cn/Spring-Boot/SpringMVC/?self)的[「5. 全局异常处理」](https://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao#)小节。 ### 7.6.3 LogoutSuccessHandlerImpl 在 [LogoutSuccessHandlerImpl](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java) 中,实现 Spring Security [LogoutSuccessHandler](https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authentication/logout/LogoutSuccessHandler.java) 接口,自定义退出的处理,主动删除 LoginUser 在 Redis 中的缓存。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// LogoutSuccessHandlerImpl.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 自定义退出处理类 返回成功</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Configuration</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">LogoutSuccessHandlerImpl</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">implements</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">LogoutSuccessHandler</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> TokenService tokenService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 退出处理</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">onLogoutSuccess</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">(HttpServletRequest request, HttpServletResponse response, Authentication authentication)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1> 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(request);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果有登录的情况下</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotNull(loginUser)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> String userName = loginUser.getUsername();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2> 删除用户缓存记录</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> tokenService.delLoginUser(loginUser.getToken());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <3> 记录用户退出日志</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"退出成功"</span>));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <4> 响应退出成功</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"退出成功"</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<1>` 处,调用 TokenService 的 `#getLoginUser(request)` 方法,获得当前 LoginUser 。 - `<2>` 处,调用 TokenService 的 `#delLoginUser(String token)` 方法,删除 LoginUser 的 Redis 缓存。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// TokenService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">void</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">delLoginUser</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(String token)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotEmpty(token)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> String userKey = getTokenKey(token);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 删除缓存</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> redisCache.deleteObject(userKey);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<3>` 处,记录相应的退出成功日志。 - `<4>` 处,响应退出成功的 JSON 字符串。 ## 7.7 登录日志 [SysLogininfor](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysLogininfor.java) ,登录日志实体。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysLogininfor.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> <span class="class" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(204, 102, 102);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">class</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">SysLogininfor</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">extends</span> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(240, 198, 116);">BaseEntity</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">static</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">final</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">long</span> serialVersionUID = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1L</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"序号"</span>, cellType = ColumnType.NUMERIC)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Long infoId;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"用户账号"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String userName;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录状态"</span>, readConverterExp = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"0=成功,1=失败"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String status;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录地址"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String ipaddr;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"登录地点"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String loginLocation;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"浏览器"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String browser;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"操作系统"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String os;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"提示消息"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> String msg;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@Excel</span>(name = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"访问时间"</span>, width = <span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">30</span>, dateFormat = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"yyyy-MM-dd HH:mm:ss"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> Date loginTime;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// ...省略 set/get 方法</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 每个字段比较简单,胖友自己根据注释理解下即可。 对应表的创建 SQL 如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">create</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">table</span> sys_logininfor (</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> info_id <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">bigint</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">20</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">not</span> <span class="literal" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">null</span> auto_increment <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'访问ID'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> user_name <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'用户账号'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ipaddr <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'登录IP地址'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> login_location <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">255</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'登录地点'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> browser <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'浏览器类型'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> os <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">50</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'操作系统'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">status</span> <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">char</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">1</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'0'</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'登录状态(0成功 1失败)'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> msg <span class="built_in" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">varchar</span>(<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">255</span>) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">default</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">''</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'提示消息'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> login_time datetime <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'访问时间'</span>,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> primary <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">key</span> (info_id)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">) <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">engine</span>=<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">innodb</span> auto_increment=<span class="number" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">100</span> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">comment</span> = <span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">'系统访问记录'</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> 在 RuoYi-Vue 中,记录 SysLogininfor 的过程如下: - 首先,**手动**调用 [`AsyncFactory#recordLogininfor(username, status, message, args)`](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java#L27-L80) 方法,创建一个 Java [TimerTask](https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/TimerTask.java) 任务。 - 然后调用 [`AsyncManager#execute(TimerTask task)`](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/framework/manager/AsyncManager.java#L38-L46) 方法,提交到定时任务的线程中,延迟 `OPERATE_DELAY_TIME = 10` 秒后,存储该记录到数据库中。 这样的好处,是可以实现**异步**存储日志到数据库中,提升 API 接口的性能。不过实际上,Spring 提供了 `@Async` 注解,方便的实现异步操作。不了解的胖友,可以看看[《芋道 Spring Boot 异步任务入门》](http://www.iocoder.cn/Spring-Boot/Async-Job/?self)。 另外,在 RuoYi-Vue 中还定义了 [SysOperLog](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysOperLog.java) ,操作日志实体类。感兴趣的胖友,自己去瞅瞅。 ## 7.8 获得用户信息 API 接口 在 [SysLoginController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java) 中,定义了 `/getInfo` 接口,获取登录的用户信息。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysLoginController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 获取用户信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@return</span> 用户信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"getInfo"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AjaxResult <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">getInfo</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <1> 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> SysUser user = loginUser.getUser();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <2> 角色标识的集合</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> Set<String> roles = permissionService.getRolePermission(user);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <3> 权限集合</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> Set<String> permissions = permissionService.getMenuPermission(user);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// <4> 返回结果</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AjaxResult ajax = AjaxResult.success();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ajax.put(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"user"</span>, user);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ajax.put(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"roles"</span>, roles);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ajax.put(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"permissions"</span>, permissions);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> ajax;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - `<1>` 处,调用 TokenService 的 `#getLoginUser(request)` 方法,获得当前 LoginUser 。 - `<2>` 处,调用 PermissionService 的 `#getRolePermission(SysUser user)` 方法,获得 LoginUser 拥有的角色**标识**的集合。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16.8px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysPermissionService.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> ISysRoleService roleService;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 获取角色数据权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@param</span> user 用户信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@return</span> 角色权限信息</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> Set<String> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">getRolePermission</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(SysUser user)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> Set<String> roles = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> HashSet<String>();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 管理员拥有所有权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (user.isAdmin()) { <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果是管理员,强制添加 admin 角色</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> roles.add(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"admin"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> } <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">else</span> { <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 如果非管理员,进行查询</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId()));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> roles;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysRoleServiceImpl.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Autowired</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">private</span> SysRoleMapper roleMapper;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">/**</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 根据用户ID查询权限</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> *</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@param</span> userId 用户ID</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> * <span class="doctag" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@return</span> 权限列表</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);"> */</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">@Override</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> Set<String> <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(129, 162, 190);">selectRolePermissionByUserId</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(222, 147, 95);">(Long userId)</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得 userId 拥有的 SysRole 数组</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// 遍历 SysRole 数组,生成角色标识数组</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> Set<String> permsSet = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">new</span> HashSet<>();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">for</span> (SysRole perm : perms) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">if</span> (StringUtils.isNotNull(perm)) {</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">","</span>)));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> }</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> permsSet;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysRoleMapper.xml</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><sql id=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectRoleVo"</span>></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope,</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> r.status, r.del_flag, r.create_time, r.remark </span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> from sys_role r</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_user_role ur on ur.role_id = r.role_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_user u on u.user_id = ur.user_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> left join sys_dept d on u.dept_id = d.dept_id</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></sql></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"><select id=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectRolePermissionByUserId"</span> parameterType=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"Long"</span> resultMap=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"SysRoleResult"</span>></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> <include refid=<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline; color: rgb(181, 189, 104);">"selectRoleVo"</span>/></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"> WHERE r.del_flag = '0' and ur.user_id = #{userId}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16.8px; vertical-align: baseline;"></select></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 通过查询 `sys_role` 表,同时连接 `sys_user_role`、`sys_user`、`sys_dept` 表,将 `userId` 对应的 SysRole 相关信息都一次性查询出来。 - 返回结果 SysRoleResult 的具体定义,点击 [传送门](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml#L7-L20) 查看,实际就是 SysRole 实体类。 - `<3>` 处,调用 SysPermissionService 的 `#getMenuPermission(SysUser user)` 方法,获得用户的 SysRoleMenu 的权限**标识**字符串的集合。 - `<4>` 处,返回用户信息的 AjaxResult 结果。 通过调用该 `/getInfo` 接口,前端就可以根据角色**标识**、又或者权限**标识**,实现对页面级别的**按钮**实现权限控制,进行有权限时显示,无权限时隐藏。 ## 7.9 获取路由信息 在 [SysLoginController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java) 中,定义了 `/getRouters` 接口,获取获取路由信息。代码如下: <table style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-weight: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border-collapse: collapse; border-spacing: 0px; border: 0px; width: auto;"><tbody style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td class="code" style="margin-block: 0px; margin: 0px; padding: 0px; outline: 0px; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: middle; border: 0px; text-align: left; font-weight: 400;"><pre style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 16px; vertical-align: baseline; background: rgb(29, 31, 33); overflow: auto; color: rgb(197, 200, 198); line-height: 1.5;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// SysLoginController.java</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="meta" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">@GetMapping</span>(<span class="string" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"getRouters"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><span class="function" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);"><span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">public</span> AjaxResult <span class="title" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(129, 162, 190);">getRouters</span><span class="params" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(222, 147, 95);">()</span> </span>{</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得当前 LoginUser</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 获得用户的 SysMenu 数组</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> SysUser user = loginUser.getUser();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);">// 构建路由 RouterVo 数组。可用于 Vue 构建管理后台的左边菜单</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(178, 148, 187);">return</span> AjaxResult.success(menuService.buildMenus(menus));</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> - 具体的代码,比较简单,胖友自己去阅读下,嘿嘿。 通过调用该 `/getRouters` 接口,前端就可以构建管理后台的左边菜单。 ## 7.10 权限管理 如下的 Controller ,提供了 RuoYi-Vue 的**权限管理**功能,比较简单,胖友自己去瞅瞅即可。 - 用户管理 [SysUserController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysUserController.java) :用户是系统操作者,该功能主要完成系统用户配置。 - 角色管理 [SysRoleController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java) :角色菜单权限分配、设置角色按机构进行数据范围权限划分。 - 菜单管理 [SysMenuController](https://github.com/YunaiV/RuoYi-Vue/blob/master/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java) :配置系统菜单,操作权限,按钮权限标识等。 ## 7.11 小小的建议 至此,我们完成了对 RuoYi-Vue 权限相关功能的源码进行解读,希望对胖友有一定的胖友。如果胖友项目中需要权限相关的功能,建议不要直接拷贝 RuoYi-Vue 的代码,而是按照自己的理解,**一点点**“重新”实现一遍。在这个过程中,我们会有更加深刻的理解,甚至会有自己的一些小创新。 # 666\. 彩蛋 相对还是比较良心的一篇文章,胖友你说是不是,嘿嘿。 这里额外在推荐一些 RabbitMQ 不错的内容: - [《Spring Security 实现原理与源码解析系统 —— 精品合集》](http://www.iocoder.cn/Spring-Security/good-collection/?self) - [《如何设计权限管理模块(附表结构)?》](http://www.iocoder.cn/Fight/How-to-design-permission-management-module-schedule-structure/?self) 不过艿艿实际项目中,并未采用 Spring Security 或是 Shiro 安全框架,而是自己团队开发了一个相对轻量级的组件。主要考虑,目前前后端分离之后,Spring Security 内置的很多功能,已经不太需要,在加上拓展一些功能不是非常方便,有点“曲折”,所以才选择自己开发。
LazzMan
2024年4月30日 17:44
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码