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 OAuth2 入门
> 本文在提供完整代码示例,可见 [https://github.com/YunaiV/SpringBoot-Labs](https://github.com/YunaiV/SpringBoot-Labs) 的 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth) 目录。 > > 原创不易,给点个 [Star](https://github.com/YunaiV/SpringBoot-Labs/stargazers) 嘿,一起冲鸭! # 1\. 概述 在[《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?self)文章中,艿艿分享了如何使用 Spring Security 实现认证与授权的功能,获得广大女粉丝的好评。 于是乎,艿艿准备再来分享一波 [Spring Security OAuth](https://github.com/spring-projects/spring-security-oauth) 框架,看看在 Spring Security 如何实现 OAuth2.0 实现**授权**的功能。 > 旁白君:实际上艿艿很早写了一篇关于 Spring Security OAuth 的[文章](http://www.iocoder.cn/Spring-Security/OAuth2-learning-learning/),考虑到版本太老,提供的示例又过于简单,所以本文也是该文章的升级版。 可能有胖友对 OAuth2.0 不是很了解,所以我们先来简单介绍下它。可能胖友看 OAuth2.0 的概念会有点懵逼,不要担心,后续看完艿艿提供的示例代码,会突然清晰的哈。 另外,阮一峰提供了几篇关于 OAuth2.0 非常不错的文章,推荐胖友去从瞅瞅。同时,本文也会直接引用它的内容,方便胖友统一理解。 - [《理解 OAuth2.0》](http://www.iocoder.cn/Fight/ruanyifeng-oauth_2_0/?self) - [《OAuth2.0 的一个简单解释》](http://www.iocoder.cn/Fight/ruanyifeng-oauth_design/?self) - [《OAuth2.0 的四种方式》](http://www.iocoder.cn/Fight/ruanyifeng-oauth-grant-types/?self) - [《GitHub OAuth 第三方登录示例教程》](http://www.iocoder.cn/Fight/ruanyifeng-github-oauth/?self) ## 1.1 OAuth2.0 是什么? > FROM [《维基百科 —— 开放授权》](https://zh.wikipedia.org/wiki/%E5%BC%80%E6%94%BE%E6%8E%88%E6%9D%83) OAuth(Open Authorization)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),**而无需将用户名和密码提供给第三方应用**。 > 旁白君:很多团队,内部会采用 OAuth2.0 实现一个**授权**服务,避免每个上层应用或者服务重复开发。 OAuth 允许用户提供一个**令牌**,而不是用户名和密码来访问他们存放在特定服务提供者的数据。 每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的 2 小时内)内访问**特定的资源**(例如仅仅是某一相册中的视频)。这样,OAuth 让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。 > 旁白君:如果胖友对接过[微信网页授权](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html)功能,就会发现分成两种方式:**静默**授权、**手动**授权。前者只能获取到用户的 **openid**,而后者可以获取到用户的**基本信息**。 OAuth2.0 是用于授权的**行业标准协议**。OAuth2.0 为简化客户端开发提供了特定的授权流,包括 Web 应用、桌面应用、移动端应用等。 > 旁白君:OAuth 1.0 协议体系本身存在一些问题,现已被各大开发平台逐渐废弃。 ## 1.2 OAuth2.0 角色解释 在 OAuth2.0 中,有如下角色: ① **Authorization** Server:**认证**服务器,用于认证用户。如果客户端认证通过,则发放访问资源服务器的**令牌**。 ② **Resource** Server:**资源**服务器,拥有受保护资源。如果请求包含正确的**访问令牌**,则可以访问资源。 > 友情提示:提供管理后台、客户端 API 的服务,都可以认为是 Resource Server。 ③ **Client**:客户端。它请求资源服务器时,会带上**访问令牌**,从而成功访问资源。 > 友情提示:Client 可以是浏览器、客户端,也可以是内部服务。 ④ Resource **Owner**:资源拥有者。最终用户,他有访问资源的**账号**与**密码**。 > 友情提示:可以简单把 Resource Owner 理解成人,她在使用 Client 访问资源。 ## 1.3 OAuth 2.0 运行流程 如下是 OAuth 2.0 的**授权码模式**的运行流程:  > - (A)用户打开客户端以后,客户端要求用户给予授权。 > - (B)用户同意给予客户端授权。 > - (C)客户端使用上一步获得的授权,向认证服务器申请令牌。 > - (D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。 > - (E)客户端使用令牌,向资源服务器申请获取资源。 > - (F)资源服务器确认令牌无误,同意向客户端开放资源。 上述的六个步骤,**B 是关键**,即用户如何给客户端进行**授权**。有了授权之,客户端就可以获取**令牌**,进而凭令牌获取**资源**。 > 友情提示:如果胖友有对接过三方开放平台,例如说微信、QQ、微博等三方登录,就会很容易理解这个步骤过程。 > > 这个时候的资源,资源主要指的是三方开放平台的用户资料等等。 ## 1.4 OAuth 2.0 授权模式 客户端必须得到用户的授权(Authorization Grant),才能获得访问令牌(Access Token)。 OAuth2.0 定义了四种授权方式: - 授权码模式(Authorization Code) - 密码模式(Resource Owner Password Credentials) - 简化模式(Implicit) - 客户端模式(Client Credentials) 其中,**密码模式**和**授权码模式**比较常用。至于如何选择,艿艿这里先提前剧透下,后续慢慢细品。 > FROM [《深度剖析 OAuth2 和微服务安全架构》](https://portal.qiniu.com/bucket/blog/resource) > >  当然,对于**黄框**部分,对于笔者还是比较困惑的。笔者认为,第三方的单页应用 SPA ,也是适合采用 Authorization Code Grant 授权模式的。例如,[《微信网页授权》](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842) : > 具体而言,网页授权流程分为四步: > > - 1、引导用户进入授权页面同意授权,获取 code > - 2、通过 code 换取网页授权 access\_token(与基础支持中的 access\_toke n不同) > - 3、如果需要,开发者可以刷新网页授权 access\_token,避免过期 > - 4、通过网页授权 access\_token 和 openid 获取用户基本信息(支持 UnionID 机制) 所以,艿艿猜测,之所以图中画的是 Implicit Grant 的原因是,受 Google 的 [《OAuth 2.0 for Client-side Web Applications》](https://developers.google.com/identity/protocols/OAuth2UserAgent) 一文中,推荐使用了 Implicit Grant 。 当然,具体使用 Implicit Grant 还是 Authorization Code Grant 授权模式,没有定论。笔者,偏向于使用 **Authorization Code Grant**,对于第三方客户端的场景。 # 2\. 密码模式 > 示例代码对应仓库: > > - 授权服务器:[`lab-68-demo02-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/) > - 资源服务器:[`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 本小节,我们来学习**密码模式(Resource Owner Password Credentials Grant)**。 密码模式,用户向客户端提供自己的**用户名和密码**。客户端使用这些信息,向**授权服务器**索要授权。 在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而授权服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。 > 旁白君:如果客户端和授权服务器都是自己公司的,显然符合。  > - (A)用户向客户端提供用户名和密码。 > - (B)客户端将**用户名和密码**发给授权服务器,向后者**请求令牌**。 > - (C)授权服务器确认无误后,向客户端提供访问令牌。 下面,我们来新建两个项目,搭建一个密码模式的使用示例。如下图所示:  - [`lab-68-demo02-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/):授权服务器。 - [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/):资源服务器。 ## 2.1 搭建授权服务器 创建 [`lab-68-demo02-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/) 项目,搭建授权服务器。 ### 2.1.1 引入依赖 创建 [`pom.xml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/pom.xml) 文件,引入 Spring Security OAuth 依赖。 <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;"><?xml version="1.0" encoding="UTF-8"?></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;">artifactId</span>></span>lab-68<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;">groupId</span>></span>cn.iocoder.springboot.labs<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;">version</span>></span>1.0-SNAPSHOT<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;">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-68-demo02-authorization-server-with-resource-owner-password-credentials<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;">properties</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="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;">spring.boot.version</span>></span>2.2.4.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;">spring.boot.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="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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="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;">maven.compiler.target</span>></span>1.8<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;">maven.compiler.target</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;">maven.compiler.source</span>></span>1.8<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;">maven.compiler.source</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;">properties</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;">dependencyManagement</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 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-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>${spring.boot.version}<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;">type</span>></span>pom<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;">type</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;">scope</span>></span>import<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;">scope</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 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;">dependencyManagement</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 OAuth2 的自动配置 --></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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.security.oauth.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-security-oauth2-autoconfigure<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>${spring.boot.version}<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;">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> 添加 [`spring-security-oauth2-autoconfigure`](https://www.iocoder.cn/Spring-Security/OAuth2-learning/spring-security-oauth2-autoconfigure) 依赖,引入 Spring Security OAuth 并实现自动配置。同时,它也引入了 Spring Security 依赖。如下图所示:  ### 2.1.2 SecurityConfig 创建 [SecurityConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/SecurityConfig.java) 配置类,提供一个账号密码为「yunai/1024」的用户。代码如下: <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;">@EnableWebSecurity</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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="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="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>(name = BeanIds.AUTHENTICATION_MANAGER)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"><span class="line" style="margin-block: 0px; 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="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> NoOpPasswordEncoder <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);">passwordEncoder</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> (NoOpPasswordEncoder) 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><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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);">// 使用内存中的 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);">// 不使用 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(passwordEncoder())</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">// 配置 yunai 用户</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 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);">"yunai"</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);">"1024"</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);">"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><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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> 我们通过 **Spring Security 提供认证功能**,所以这里需要配置一个用户。 > 友情提示:看不懂这个配置的胖友,后续可回[《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?self)重造下。 ### 2.1.3 OAuth2AuthorizationServerConfig 创建 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.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="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;">@EnableAuthorizationServer</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">OAuth2AuthorizationServerConfig</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);">AuthorizationServerConfigurerAdapter</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 class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"> * 用户认证 Manager</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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> 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;">@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);">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);">(AuthorizationServerEndpointsConfigurer endpoints)</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;"> endpoints.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><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">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);">(AuthorizationServerSecurityConfigurer oauthServer)</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;"> oauthServer.checkTokenAccess(<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);">"isAuthenticated()"</span>);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@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);">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);">(ClientDetailsServiceConfigurer clients)</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;"> clients.inMemory() <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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.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;"> .withClient(<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);">"clientapp"</span>).secret(<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);">"112233"</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);">// <4.2> Client 账号、密码。</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .authorizedGrantTypes(<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);">"password"</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);">// <4.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;"> .scopes(<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);">"read_userinfo"</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);">"read_contacts"</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);">// <4.2> 可授权的 Scope</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">// .and().withClient() // <4.3> 可以继续配置新的 Client</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;"><span class="line" style="margin-block: 0px; 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> ① 在类上添加 [`@EnableAuthorizationServer`](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configuration/EnableAuthorizationServer.java) 注解,声明开启 OAuth **授权**服务器的功能。 同时,继承 [AuthorizationServerConfigurerAdapter](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configuration/AuthorizationServerConfigurerAdapter.java) 类,进行 OAuth **授权**服务器的配置。 ② `#configure(AuthorizationServerEndpointsConfigurer endpoints)` 方法,配置使用的 AuthenticationManager 实现**用户认证**的功能。其中,`authenticationManager` 是由[「2.1.2 SecurityConfig」](https://www.iocoder.cn/Spring-Security/OAuth2-learning/#)创建,Spring Security 的配置类。 ③ `#configure(AuthorizationServerSecurityConfigurer oauthServer)` 方法,设置 `/oauth/check_token` 端点,通过认证后可访问。 > 友情提示:这里的认证,指的是使用 `client-id` + `client-secret` 进行的**客户端**认证,不要和**用户**认证混淆。 其中,`/oauth/check_token` 端点对应 [CheckTokenEndpoint](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/endpoint/CheckTokenEndpoint.java) 类,用于校验访问令牌的有效性。 - 在客户端访问资源服务器时,会在请求中带上**访问令牌**。 - 在资源服务器收到客户端的请求时,会使用请求中的**访问令牌**,找授权服务器确认该**访问令牌**的有效性。  ④ `#configure(ClientDetailsServiceConfigurer clients)` 方法,进行 Client 客户端的配置。 `<4.1>` 处,设置使用基于**内存**的 Client 存储器。实际情况下,最好放入**数据库**中,方便管理。  `<4.2>` 处,创建一个 Client 配置。如果要继续添加另外的 Client 配置,可以在 `<4.3>` 处使用 `#and()` 方法继续拼接。注意,这里的 `.withClient("clientapp").secret("112233")` 代码段,就是 `client-id` 和 `client-secret`。 > 补充知识:可能会有胖友会问,为什么要创建 Client 的 `client-id` 和 `client-secret` 呢? > > 通过 `client-id` 编号和 `client-secret`,授权服务器可以知道调用的来源以及正确性。这样,即使“坏人”拿到 Access Token ,但是没有 `client-id` 编号和 `client-secret`,也不能和授权服务器发生**有效**的交互。 ### 2.1.4 AuthorizationServerApplication 创建 [AuthorizationServerApplication](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/AuthorizationServerApplication.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="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);">AuthorizationServerApplication</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(AuthorizationServerApplication.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.1.5 简单测试 执行 AuthorizationServerApplication 启动授权服务器。下面,我们使用 **Postman 模拟一个 Client**。 ① `POST` 请求 [http://localhost:8080/oauth/token](http://localhost:8080/oauth/token) 地址,使用密码模式进行**授权**。如下图所示: -  -  请求说明: - 通过 [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) 的方式,填写 `client-id` + `client-secret` 作为用户名与密码,实现 Client 客户端有效性的认证。 - 请求参数 `grant_type` 为 `"password"`,表示使用**密码模式**。 - 请求参数 `username` 和 `password`,表示**用户**的用户名与密码。 响应说明: - 响应字段 `access_token` 为**访问令牌**,后续客户端在访问资源服务器时,通过它作为身份的标识。 - 响应字段 `token_type` 为**令牌类型**,一般是 `bearer` 或是 `mac` 类型。 - 响应字段 `expires_in` 为访问令牌的**过期时间**,单位为秒。 - 响应字段 `scope` 为**权限范围**。 > 友情提示:`/oauth/token` 对应 [TokenEndpoint](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/endpoint/TokenEndpoint.java) 端点,提供 OAuth2.0 的四种授权模式。感兴趣的胖友,可以后续去撸撸。 ② `POST` 请求 [http://localhost:8080/oauth/check\_token](http://localhost:8080/oauth/check_token) 地址,校验访问令牌的有效性。如下图所示: -  -  请求和响应比较简单,胖友自己瞅瞅即可。 ## 2.2 搭建资源服务器 创建 [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 项目,搭建资源服务器。 ### 2.2.1 引入依赖 创建 [`pom.xml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/pom.xml) 文件,引入 Spring Security OAuth 依赖。 <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;"><?xml version="1.0" encoding="UTF-8"?></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;">artifactId</span>></span>lab-68<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;">groupId</span>></span>cn.iocoder.springboot.labs<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;">version</span>></span>1.0-SNAPSHOT<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;">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-68-demo02-resource-server<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;">properties</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="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;">spring.boot.version</span>></span>2.2.4.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;">spring.boot.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="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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="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;">maven.compiler.target</span>></span>1.8<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;">maven.compiler.target</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;">maven.compiler.source</span>></span>1.8<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;">maven.compiler.source</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;">properties</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;">dependencyManagement</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 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-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>${spring.boot.version}<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;">type</span>></span>pom<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;">type</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;">scope</span>></span>import<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;">scope</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 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;">dependencyManagement</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 OAuth2 的自动配置 --></span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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.security.oauth.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-security-oauth2-autoconfigure<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>${spring.boot.version}<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;">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.1.1 引入依赖」](https://www.iocoder.cn/Spring-Security/OAuth2-learning/#)小节,是一致的哈。 ### 2.2.2 配置文件 创建 [`application.yml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/resources/application.yml) 配置文件,添加 Spring Security OAuth 相关配置。 <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;">server:</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"> port:</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);">9090</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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="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="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;"> oauth2:</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);"># OAuth2 Client 配置,对应 OAuth2ClientProperties 类</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"> client:</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"> client-id:</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);">clientapp</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"> client-secret:</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);">112233</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);"># OAuth2 Resource 配置,对应 ResourceServerProperties 类</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"> 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="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;"> token-info-uri:</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;">http://127.0.0.1:8080/oauth/check_token</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);"># 获得 Token 信息的 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;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; color: rgb(150, 152, 150);"># 访问令牌获取 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;"><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;"> access-token-uri:</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;">http://127.0.0.1:8080/oauth/token</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ① `security.oauth2.client` 配置项,OAuth2 Client 配置,对应 [OAuth2ClientProperties](https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientProperties.java) 类。在这个配置项中,我们添加了客户端的 `client-id` 和 `client-secret`。 为什么要添加这个配置项呢?因为资源服务器会调用授权服务器的 `/oauth/check_token` 接口,而考虑到安全性,我们配置了该接口需要进过**客户端认证**。 > 友情提示:这里艿艿偷懒了,其实**单独**给资源服务器配置一个 Client 的 `client-id` 和 `client-secret`。我们可以把资源服务器理解成授权服务器的**一个特殊的客户端**。 ② `security.oauth2.resource` 配置项,OAuth2 Resource 配置,对应 [ResourceServerProperties](https://github.com/spring-projects/spring-security-oauth2-boot/blob/master/spring-security-oauth2-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerProperties.java) 类。 这里,我们通过 `token-info-uri` 配置项,设置使用授权服务器的 `/oauth/check_token` 接口,校验访问令牌的有效性。 ③ `security.access-token-uri` 配置项,是**我们自定义**的,设置授权服务器的 `oauth/token` 接口,获取访问令牌。因为稍后我们将在 [LoginController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/LoginController.java) 中,实现一个 `/login` 登录接口。 ### 2.2.3 OAuth2ResourceServerConfig 创建 [OAuth2ResourceServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/config/OAuth2ResourceServerConfig.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="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;">@EnableResourceServer</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">OAuth2ResourceServerConfig</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);">ResourceServerConfigurerAdapter</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;">@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);">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.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);">// 设置 /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;"> .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>).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;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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;"> ;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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> ① 在类上添加 [`@EnableResourceServer`](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configuration/EnableResourceServer.java) 注解,声明开启 OAuth **资源**服务器的功能。 同时,继承 [ResourceServerConfigurerAdapter](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configuration/ResourceServerConfigurerAdapter.java) 类,进行 OAuth **资源**服务器的配置。 ② `#configure(HttpSecurity http)` 方法,设置 HTTP 权限。这里,我们设置 `/login` 接口**无需**权限访问,其它接口**认证**后可访问。 这样,客户端在访问资源服务器时,其请求中的**访问令牌**会被**资源**服务器调用**授权**服务器的 `/oauth/check_token` 接口,进行校验访问令牌的正确性。 ### 2.2.4 ExampleController 创建 [ExampleController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/ExampleController.java) 类,提供 `/api/example/hello` 接口,表示一个资源。代码如下: <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;">@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);">"/api/example"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">ExampleController</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;">@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);">"/hello"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">hello</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);">"world"</span>;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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.2.5 ResourceServerApplication 创建 [ResourceServerApplication](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/ResourceServerApplication.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="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);">ResourceServerApplication</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(ResourceServerApplication.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.2.6 简单测试(第一弹) 执行 ResourceServerApplication 启动资源服务器。下面,我们来请求服务器的 <127.0.0.1:9090/api/example/hello> 接口,进行相应的测试。 ① 首先,请求 <127.0.0.1:9090/api/example/hello> 接口,**不带**访问令牌,则请求会被**拦截**。如下图所示:  ② 然后,请求 <127.0.0.1:9090/api/example/hello> 接口,带上**错误**的访问令牌,则请求会被**拦截**。如下图所示:  > 友情提示:访问令牌需要在请求头 `"Authorization"` 上设置,并且以 `"Bearer "` 开头。 ③ 最后,请求 <127.0.0.1:9090/api/example/hello> 接口,带上**正确**的访问令牌,则请求会被**通过**。如下图所示:  ### 2.2.7 LoginController 创建 [LoginController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/LoginController.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="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);">"/"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">LoginController</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> OAuth2ClientProperties oauth2ClientProperties;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@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: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"${security.oauth2.access-token-uri}"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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 accessTokenUri;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@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> OAuth2AccessToken <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);">(@RequestParam(<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);">"username"</span>)</span> String 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="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="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);">RequestParam</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 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);">"password"</span>)</span> String 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);">// <1> 创建 ResourceOwnerPasswordResourceDetails 对象</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ResourceOwnerPasswordResourceDetails resourceDetails = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> ResourceOwnerPasswordResourceDetails();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setAccessTokenUri(accessTokenUri);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setClientId(oauth2ClientProperties.getClientId());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setClientSecret(oauth2ClientProperties.getClientSecret());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setUsername(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;"> resourceDetails.setPassword(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="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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> 创建 OAuth2RestTemplate 对象</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> OAuth2RestTemplate restTemplate = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> OAuth2RestTemplate(resourceDetails);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> restTemplate.setAccessTokenProvider(<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> ResourceOwnerPasswordAccessTokenProvider());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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;"> <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> restTemplate.getAccessToken();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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> 在 `/login` 接口中,**资源**服务器扮演的是一个 OAuth **客户端**的角色,调用授权服务器的 `/oauth/token` 接口,使用**密码模式**进行授权,获得**访问令牌**。 ① `<1>` 处,创建 [ResourceOwnerPasswordResourceDetails](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/token/grant/password/ResourceOwnerPasswordResourceDetails.java) 对象,填写**密码模式**授权需要的**请求**参数。 ② `<2>` 处,创建 [OAuth2RestTemplate](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/OAuth2RestTemplate.java) 对象,它是 Spring Security OAuth 封装的工具类,用于请求**授权**服务器。 同时,将 [ResourceOwnerPasswordAccessTokenProvider](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/token/grant/password/ResourceOwnerPasswordAccessTokenProvider.java) 设置到其中,表示使用**密码模式**授权。 > 友情提示:这一步非常重要,艿艿在这里卡了非常非常非常久,一度自闭要放弃。 ③ `<3>` 处,调用 OAuth2RestTemplate 的 `#getAccessToken()` 方法,调用授权服务器的 `/oauth/token` 接口,进行**密码**模式的授权。 注意,OAuth2RestTemplate 是**有状态**的工具类,所以需要每次都**重新**创建。 ### 2.2.8 简单测试(第二弹) 重新执行 ResourceServerApplication 启动资源服务器。下面,我们来进行 `/login` 接口的测试。 ① 首先,请求 [http://127.0.0.1:9090/login](http://127.0.0.1:9090/login) 接口,使用**用户**的**用户名**与**密码**进行登录,获得访问令牌。如下图所示:  响应结果和授权服务器的 `/oauth/token` 接口是一致的,因为就是调用它,嘿嘿~ ② 然后,请求 <127.0.0.1:9090/api/example/hello> 接口,带**刚刚的**访问令牌,则请求会被通过。如下图所示:  # 3\. 授权码模式 > 示例代码对应仓库: > > - 授权服务器:[`lab-68-demo02-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/) > - 资源服务器:[`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 本小节,我们来学习**授权码模式(Authorization Code)**。 授权码模式,是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的**后台**服务器,与**授权**务器进行互动。 > 旁白君:一般情况下,**在有客户端**的情况下,我们与第三方平台常常采用这种方式。  > - (A)用户访问客户端,后者将前者跳转到到**授权**服务器。 > - (B)用户选择是否给予客户端授权。 > - (C)假设用户给予授权,授权服务器将跳转到客户端事先指定的"重定向 URI"(Redirection URI),同时附上一个**授权码**。 > - (D)客户端收到授权码,附上早先的"重定向 URI",向认证服务器申请**令牌**。这一步是在客户端的后台的服务器上完成的,对用户不可见。 > - (E)认证服务器核对了**授权码**和**重定向 URI**,确认无误后,向客户端发送**访问令牌**。 下面,我们来新建两个项目,搭建一个授权码模式的使用示例。如下图所示:  - [`lab-68-demo02-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/):授权服务器。 - [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/):资源服务器。 ## 3.1 搭建授权服务器 复制出 [`lab-68-demo02-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-resource-owner-password-credentials/) 项目,**修改**搭建授权服务器。改动点如下图所示:  仅仅需要修改 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-authorization-code/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.java) 类,设置使用 `"authorization_code"` 授权码模式,并设置回调地址。 🙂 注意,这里设置的回调地址,稍后我们会在[「3.2 搭建资源服务器」](https://www.iocoder.cn/Spring-Security/OAuth2-learning/#)中实现。 ### 3.1.1 简单测试 执行 AuthorizationServerApplication 启动授权服务器。 ① 使用**浏览器**,访问 [http://127.0.0.1:8080/oauth/authorize?client\_id=clientapp&redirect\_uri=http://127.0.0.1:9090/callback&response\_type=code&scope=read\_userinfo](http://127.0.0.1:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://127.0.0.1:9090/callback&response_type=code&scope=read_userinfo) 地址,获取**授权**。请求参数说明如下: - `client_id` 参数,**必传**,为我们在 OAuth2AuthorizationServer 中配置的 Client 的编号。 - `redirect_uri` 参数,**可选**,回调地址。当然,如果 `client_id` 对应的 Client 未配置 `redirectUris` 属性,会报错。 - `response_type` 参数,**必传**,返回结果为 `code` **授权码**。 - `scope` 参数,**可选**,申请授权的 Scope 。如果多个,使用逗号分隔。 - `state` 参数,**可选**,表示客户端的当前状态,可以指定任意值,授权服务器会原封不动地返回这个值。 > 友情提示:`state` 参数,未在上述 URL 中体现出来。 因为我们并未**登录**授权服务器,所以被拦截跳转到登录界面。如下图所示:  ② 输入用户的账号密码「yunai/1024」进行登录。登录完成后,进入授权界面。如下图所示: > 旁白君:和我们日常使用的腾讯 QQ、微信、微博等等三方登录,是一模一样的,除了丑了点,嘿嘿~  ③ 选择 `scope.read_userinfo` 为 Approve 允许,点击「Authorize」按钮,完成**授权**操作。浏览器自动重定向到 Redirection URI 地址,并且在 URI 上可以看到 `code` 授权码。如下图所示:  > 友情提示:`/oauth/authorize` 对应 [AuthorizationEndpoint](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/endpoint/AuthorizationEndpoint.java) 端点。 ④ 因为我们暂时没有启动**资源**服务器,所以显示无法访问。这里,我们先使用 Postman 模拟请求 [http://localhost:8080/oauth/token](http://localhost:8080/oauth/token) 地址,使用**授权码**获取到**访问令牌**。如下图所示: -  -  请求说明: - 通过 [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) 的方式,填写 `client-id` + `client-secret` 作为用户名与密码,实现 Client 客户端有效性的认证。 - 请求参数 `grant_type` 为 `"authorization_code"`,表示使用**授权码模式**。 - 请求参数 `code`,从授权服务器获取到的**授权码**。 - 请求参数 `redirect_uri`,Client 客户端的 **Redirection URI** 地址。 注意,授权码**仅能使用一次**,重复请求会报 `Invalid authorization code:` 错误。如下图所示:  ## 3.2 搭建资源服务器 复用 [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 项目,主要是提供回调地址。如下图所示:  ① 新建 [CallbackController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/CallbackController.java) 类,提供 `/callback` 回调地址。 ② 在 [OAuth2ResourceServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/config/OAuth2ResourceServerConfig.java) 配置类中,设置 `/callback` 回调地址无需权限验证,不然回调都跳转不过来哈。 ### 3.2.1 CallbackController 创建 [CallbackController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/CallbackController.java) 类,提供 `/callback` 回调地址,在获取到**授权码**时,请求**授权**服务器,通过**授权码**获取**访问令牌**。代码如下: <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;">@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);">"/"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">CallbackController</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> OAuth2ClientProperties oauth2ClientProperties;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@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: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"${security.oauth2.access-token-uri}"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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 accessTokenUri;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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);">"/callback"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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> OAuth2AccessToken <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);">(@RequestParam(<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);">"code"</span>)</span> String 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);">// 创建 AuthorizationCodeResourceDetails 对象</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> AuthorizationCodeResourceDetails resourceDetails = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> AuthorizationCodeResourceDetails();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setAccessTokenUri(accessTokenUri);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setClientId(oauth2ClientProperties.getClientId());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setClientSecret(oauth2ClientProperties.getClientSecret());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">// 创建 OAuth2RestTemplate 对象</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> OAuth2RestTemplate restTemplate = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> OAuth2RestTemplate(resourceDetails);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> restTemplate.getOAuth2ClientContext().getAccessTokenRequest().setAuthorizationCode(code); <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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> 设置 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;"> restTemplate.getOAuth2ClientContext().getAccessTokenRequest().setPreservedState(<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://127.0.0.1:9090/callback"</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);">// <2> 通过这个方式,设置 redirect_uri 参数</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> restTemplate.setAccessTokenProvider(<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> AuthorizationCodeAccessTokenProvider());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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> restTemplate.getAccessToken();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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> 代码比较简单,还是使用 OAuth2RestTemplate 进行请求授权服务器,胖友自己瞅瞅哈。 需要注意的是 `<1>` 和 `<2>` 处,设置请求授权服务器需要的 `code` 和 `redirect_uri` 参数。 ### 3.2.2 简单测试 执行 ResourceServerApplication 启动资源服务器。 重复[「3.2.1 简单测试」](https://www.iocoder.cn/Spring-Security/OAuth2-learning/#)的过程,成功获取到**访问令牌**。如下图所示:  # 4\. 简化模式 > 示例代码对应仓库: > > - 授权服务器:[`lab-68-demo02-authorization-server-with-implicit`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-implicit/) > - 资源服务器:[`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 本小节,我们来学习**简化模式(Implicit)**。 简化模式,不通过第三方应用程序的服务器,直接在浏览器中向**授权**服务器申请令牌,**跳过**了“授权码”这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是**可见**的,且客户端不需要授权。  > - (A)用户访问客户端,后者将前者跳转到到**授权**服务器。 > - (B)用户选择是否给予客户端授权。 > - (C)假设用户给予授权,授权服务器将用户导向客户端指定的"重定向URI",并在 URI 的 **Hash 部分**包含了**访问令牌**。 > - (D)浏览器向资源服务器发出请求,其中不包括上一步收到的 Hash 值。 > - (E)资源服务器返回一个网页,其中包含的代码可以获取 Hash 值中的令牌。 > - (F)浏览器执行上一步获得的脚本,提取出令牌。 > - (G)浏览器将令牌发给客户端。  - [`lab-68-demo02-authorization-server-with-implicit`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-implicit/):授权服务器。 - [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/):资源服务器。 ## 4.1 搭建授权服务器 复制出 [`lab-68-demo02-authorization-server-with-implicit`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-implicit/) 项目,**修改**搭建授权服务器。改动点如下图所示:  仅仅需要修改 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-implicit/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.java) 类,设置使用 `"implicit"` 简化模式,并设置回调地址。 🙂 注意,这里设置的回调地址,稍后我们会在[「4.2 搭建资源服务器」](https://www.iocoder.cn/Spring-Security/OAuth2-learning/#)中实现。 ## 4.2 搭建资源服务器 复用 [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 项目,主要是提供回调地址。如下图所示:  ① 新建 [Callback02Controller](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/Callback02Controller.java) 类,提供 `/callback02` 回调地址。代码如下: <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;">@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);">"/"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">Callback02Controller</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);">"/callback02"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">()</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> > 友情提示:考虑到暂时不想做页面,所以这里先假装一下,嘿嘿。 ② 在 [OAuth2ResourceServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/config/OAuth2ResourceServerConfig.java) 配置类中,设置 `/callback02` 回调地址无需权限验证,不然回调都跳转不过来哈。 ## 4.3 简单测试 执行 AuthorizationServerApplication 启动授权服务器。 执行 ResourceServerApplication 启动资源服务器。 ① 使用**浏览器**,访问 [http://127.0.0.1:8080/oauth/authorize?client\_id=clientapp&redirect\_uri=http://127.0.0.1:9090/callback02&response\_type=token&scope=read\_userinfo](http://127.0.0.1:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://127.0.0.1:9090/callback02&response_type=token&scope=read_userinfo) 地址,获取**授权**。请求参数说明如下: - `client_id` 参数,**必传**,为我们在 OAuth2AuthorizationServer 中配置的 Client 的编号。 - `redirect_uri` 参数,**可选**,回调地址。当然,如果 `client_id` 对应的 Client 未配置 `redirectUris` 属性,会报错。 - `response_type` 参数,**必传**,返回结果为 `token` **访问令牌**。 - `scope` 参数,**可选**,申请授权的 Scope 。如果多个,使用逗号分隔。 - `state` 参数,**可选**,表示客户端的当前状态,可以指定任意值,授权服务器会原封不动地返回这个值。 > 友情提示:`state` 参数,未在上述 URL 中体现出来。 因为我们并未**登录**授权服务器,所以被拦截跳转到登录界面。如下图所示:  ② 输入用户的账号密码「yunai/1024」进行登录。登录完成后,进入授权界面。如下图所示: > 旁白君:和我们日常使用的腾讯 QQ、微信、微博等等三方登录,是一模一样的,除了丑了点,嘿嘿~  ③ 选择 `scope.read_userinfo` 为 Approve 允许,点击「Authorize」按钮,完成**授权**操作。浏览器自动重定向到 Redirection URI 地址,并且在 URI 上的 **Hash 部分**可以看到 `access_token` 访问令牌。如下图所示:  后续,可以通过编写 Javascript 脚本的代码,获取 URI 上的 **Hash 部分**的访问令牌。 # 5\. 客户端模式 > 示例代码对应仓库: > > - 授权服务器:[`lab-68-demo02-authorization-server-with-client-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-client-credentials/) > - 资源服务器:[`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 本小节,我们来学习**客户端模式(Client Credentials)**。 客户端模式,指客户端以自己的名义,而不是以用户的名义,向授权服务器进行认证。 严格地说,客户端模式并不属于 OAuth 框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求授权服务器提供服务,其实不存在授权问题。 > 旁白君:我们对接微信公众号时,就采用的客户端模式。我们的后端服务器就扮演“客户端”的角色,与微信公众号的后端服务器进行交互。  > - (A)客户端向授权服务器进行身份认证,并要求一个**访问令牌**。 > - (B)授权服务器确认无误后,向客户端提供访问令牌。 下面,我们来新建两个项目,搭建一个客户端模式的使用示例。如下图所示:  - [`lab-68-demo02-authorization-server-with-client-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-client-credentials/):授权服务器。 - [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/):资源服务器。 ## 5.1 搭建授权服务器 复制出 [`lab-68-demo02-authorization-server-with-client-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-client-credentials/) 项目,**修改**搭建授权服务器。改动点如下图所示:  ① 删除 SecurityConfig 配置类,因为客户端模式下,无需 Spring Security 提供用户的认证功能。 但是,Spring Security OAuth 需要一个 PasswordEncoder Bean,否则会报错,因此我们在 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-client-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.java) 类的 `#passwordEncoder()` 方法进行创建。 ② 修改 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-authorization-server-with-implicit/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.java) 类,设置使用 `"client_credentials"` 客户端模式。 ### 5.1.1 简单测试 执行 AuthorizationServerApplication 启动授权服务器。下面,我们使用 **Postman 模拟一个 Client**。 ① `POST` 请求 [http://localhost:8080/oauth/token](http://localhost:8080/oauth/token) 地址,使用客户端模式进行**授权**。如下图所示: -  -  请求说明: - 通过 [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) 的方式,填写 `client-id` + `client-secret` 作为用户名与密码,实现 Client 客户端有效性的认证。 - 请求参数 `grant_type` 为 `"client_credentials"`,表示使用**客户端模式**。 响应就是访问令牌,胖友自己瞅瞅即可。 ## 5.2 搭建资源服务器 复用 [`lab-68-demo02-resource-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/) 项目,修改点如下图所示:  ① 新建 [ClientLoginController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/controller/ClientLoginController.java) 类,提供 `/client-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="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);">"/"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">ClientLoginController</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> OAuth2ClientProperties oauth2ClientProperties;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@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: 16px; vertical-align: baseline; color: rgb(181, 189, 104);">"${security.oauth2.access-token-uri}"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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 accessTokenUri;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@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);">"/client-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> OAuth2AccessToken <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);">()</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);">// 创建 ClientCredentialsResourceDetails 对象</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> ClientCredentialsResourceDetails resourceDetails = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> ClientCredentialsResourceDetails();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setAccessTokenUri(accessTokenUri);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setClientId(oauth2ClientProperties.getClientId());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> resourceDetails.setClientSecret(oauth2ClientProperties.getClientSecret());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">// 创建 OAuth2RestTemplate 对象</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> OAuth2RestTemplate restTemplate = <span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> OAuth2RestTemplate(resourceDetails);</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> restTemplate.setAccessTokenProvider(<span class="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> ClientCredentialsAccessTokenProvider());</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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> restTemplate.getAccessToken();</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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> 代码比较简单,还是使用 OAuth2RestTemplate 进行请求授权服务器,胖友自己瞅瞅哈。 ② 在 [OAuth2ResourceServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo02-resource-server/src/main/java/cn/iocoder/springboot/lab68/resourceserverdemo/config/OAuth2ResourceServerConfig.java) 配置类中,设置 `/client-login` 接口无需权限验证,不然无法调用哈。 ### 5.2.1 简单测试 执行 ResourceServerApplication 启动资源服务器。 ① 使用[「5.1.1 简单测试」](https://www.iocoder.cn/Spring-Security/OAuth2-learning/#)小节获得的**访问令牌**,请求 <127.0.0.1:9090/api/example/hello> 接口时**带上**,则请求会被**通过**。如下图所示:  ② 请求 [http://127.0.0.1:9090/clientlogin](http://127.0.0.1:9090/clientlogin) 接口,使用**客户端模式**进行授权,获得访问令牌。如下图所示:  响应结果和授权服务器的 `/oauth/token` 接口是一致的,因为就是调用它,嘿嘿~ # 6\. 合并服务器 > 旁白君:这个小节的标题,艿艿有点不知道怎么取了,就先叫合并服务器吧 = =! 在项目比较小时,考虑到节省服务器资源,会考虑将**授权**服务器和**资源**服务器**合并**到一个项目中,避免启动多个 Java 进程。良心的艿艿,编写了四种授权模式的示例,如下图所示:  - 基于**密码**模式的示例:[`lab-68-demo01-resource-owner-password-credentials-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo01-resource-owner-password-credentials-server/) - 基于**授权码**模式的示例:[`lab-68-demo01-authorization-code-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo01-authorization-code-server/) - 基于**简化**模式的示例:[`lab-68-demo01-implicit-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo01-implicit-server/) - 基于**客户端**模式的示例:[`lab-68-demo01-client-credentials-server`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo01-client-credentials-server/) 具体的代码实现,实际和上述每个授权模式对应的小节是基本一致的,只是说将代码“**放**”在了一个项目中。嘿嘿~ # 7\. 刷新令牌 > 示例代码对应仓库: > > - 授权服务器:[`lab-68-demo03-authorization-server-with-client-credentials`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials) 在 OAuth2.0 中,一共有**两类**令牌: - **访问**令牌(Access Token) - **刷新**令牌(Refresh Token) 在**访问**令牌过期时,我们可以使用**刷新**令牌向**授权**服务器获取一个**新**的访问令牌。 可能会胖友有疑惑,为什么会有**刷新**令牌呢?每次请求资源服务器时,都会在请求上带上**访问**令牌,这样它的泄露风险是**相对**高的。 因此,出于**安全性**的考虑,访问令牌的过期时间**比较短**,刷新令牌的过期时间**比较长**。这样,如果访问令牌即使被盗用走,那么在一定的时间后,访问令牌也能在较短的时间吼过期。当然,安全也是相对的,如果使用刷新令牌后,获取到新的访问令牌,访问令牌**后续**又**可能**被盗用。 艿艿整理了下,大家常用开放平台的令牌过期时间,让大家更好的理解: | 开放平台 | Access Token 有效期 | Refresh Token 有效期 | | --- | --- | --- | | [微信开放平台](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN) | 2 小时 | 未知 | | [腾讯开放平台](http://wiki.open.qq.com/wiki/website/%E8%8E%B7%E5%8F%96Access_Token) | 90 天 | 未知 | | [小米开放平台](https://dev.mi.com/docs/passport/access-token-life-cycle/) | 90 天 | 10 年 | ## 7.1 示例项目 下面,复制出 [`lab-68-demo03-authorization-server-with-client-credentials`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials) 项目,搭建**提供访问令牌**的**授权**服务器。改动点如下图所示:  ① 在 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.java) 的 `#configure(ClientDetailsServiceConfigurer clients)` 方法中,在配置的 Client 的授权模式中,额外新增 `"refresh_token"` 刷新令牌。 通过 `#accessTokenValiditySeconds(int accessTokenValiditySeconds)` 方法,设置**访问**令牌的有效期。 通过 `#refreshTokenValiditySeconds(int refreshTokenValiditySeconds)` 方法,设置**刷新**令牌的有效期。 ② 在 [OAuth2AuthorizationServerConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/OAuth2AuthorizationServerConfig.java) 的 `#configure(AuthorizationServerEndpointsConfigurer endpoints)` 方法中,设置使用的 `userDetailsService` 用户详情 Service。 而该 `userDetailsService` 是在 [SecurityConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/SecurityConfig.java) 的 `#userDetailsServiceBean()` 方法创建的 UserDetailsService Bean。 > 友情提示:如果不进行 UserDetailsService 的设置,在使用**刷新**令牌获取新的**访问**令牌时,会抛出异常。 ## 7.2 简单测试 执行 AuthorizationServerApplication 启动授权服务器。下面,我们使用 **Postman 模拟一个 Client**。 ① `POST` 请求 [http://localhost:8080/oauth/token](http://localhost:8080/oauth/token) 地址,使用**密码**模式进行**授权**。如下图所示:  **额外**多返回了 `refresh_token` 刷新令牌。 ② `POST` 请求 [http://localhost:8080/oauth/token](http://localhost:8080/oauth/token) 地址,使用**刷新令牌**模式进行**授权**。如下图所示:  请求说明: - 通过 [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) 的方式,填写 `client-id` + `client-secret` 作为用户名与密码,实现 Client 客户端有效性的认证。 - 请求参数 `grant_type` 为 `"refresh_token"`,表示使用**刷新令牌模式**。 - 请求参数 `refresh_token`,表示**刷新令牌**。 在响应中,返回了**新的** `access_token` **访问**令牌。注意,**老的** `access_token` **访问**令牌会**失效**,无法继续使用。 # 8\. 删除令牌 > 示例代码对应仓库: > > - 授权服务器:[`lab-68-demo03-authorization-server-with-client-credentials`](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials) 在用户**登出**系统时,我们会有**删除**令牌的需求。虽然说,可以通过客户端**本地**删除令牌的方式实现。但是,考虑到真正的彻底的实现删除令牌,必然服务端**自身**需要删除令牌。 > 友情提示:客户端**本地**删除令牌的方式实现,指的是清楚本地 Cookie、localStorage 的令牌缓存。 在 Spring Security OAuth2 中,**并没有提供内置的接口**,所以需要自己去实现。笔者参看 [《Spring Security OAuth2 – Simple Token Revocation》](https://www.baeldung.com/spring-security-oauth-revoke-tokens) 文档,实现删除令牌的 API 接口。 具体的实现,通过调用 [ConsumerTokenServices](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/ConsumerTokenServices.java) 的 `#revokeToken(String tokenValue)` 方法,删除**访问**令牌和**刷新**令牌。如下图所示:  ## 8.1 示例项目 下面,我们直接在**授权**服务器 [`lab-68-demo03-authorization-server-with-resource-owner-password-credentials`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials/) 项目,修改接入删除令牌的功能。改动点如下图所示:  ① 创建 [TokenDemoController](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/controller/TokenDemoController.java) 类,提供 `/token/demo/revoke` 接口,调用 ConsumerTokenServices 的 `#revokeToken(String tokenValue)` 方法,删除**访问**令牌和**刷新**令牌。代码如下: <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;">@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);">"/token/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);">TokenDemoController</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> ConsumerTokenServices tokenServices;</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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;">@PostMapping</span>(value = <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);">"/revoke"</span>)</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 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);">revokeToken</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);">(@RequestParam(<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);">"token"</span>)</span> String 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="keyword" style="margin-block: 0px; margin: 0px; padding: 0px; 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> tokenServices.revokeToken(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><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; 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> ② 在 [SecurityConfig](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-68-spring-security-oauth/lab-68-demo03-authorization-server-with-resource-owner-password-credentials/src/main/java/cn/iocoder/springboot/lab68/authorizationserverdemo/config/SecurityConfig.java) 配置类,设置 `/token/demo/revoke` 接口**无需授权**,方便测试。代码如下: <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.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;"> .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);">// 设置 /token/demo/revoke 无需授权</span></span><br style="margin-block: 0px; margin: 0px; padding: 0px;"><span class="line" style="margin-block: 0px; margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"> .mvcMatchers(<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);">"/token/demo/revoke"</span>).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;"> <span class="comment" style="margin-block: 0px; margin: 0px; padding: 0px; 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;">}</span><br style="margin-block: 0px; margin: 0px; padding: 0px;"></pre></td></tr></tbody></table> ## 8.2 简单测试 执行 AuthorizationServerApplication 启动授权服务器。下面,我们使用 **Postman 模拟一个 Client**。 ① `POST` 请求 [http://localhost:8080/oauth/token](http://localhost:8080/oauth/token) 地址,使用**密码**模式进行**授权**。如下图所示:  ② `POST` 请求 [http://localhost:8080/token/demo/revoke](http://localhost:8080/token/demo/revoke) 地址,删除令牌。如下图所示:  删除成功。后续,胖友可以自己调用**授权**服务器的 `oauth/check_token` 接口,测试**访问**令牌是否已经被删除。 # 666\. 彩蛋 至此,我们完整学习 Spring Security OAuth 框架。不过 Spring 团队宣布该框架处于 Deprecation **废弃**状态。如下图所示:  同时,Spring 团队正在实现新的 [Spring Authorization Server](https://github.com/spring-projects-experimental/spring-authorization-server) **授权**服务器,目前还处于 Experimental **实验**状态。 实际项目中,根据艿艿了解到的情况,很少项目会直接采用 Spring Security OAuth 框架,而是**自己参考它进行 OAuth2.0 的实现**。并且,一般只会实现**密码**授权模式。 --- 在本文中,我们采用基于**内存**的 [InMemoryTokenStore](https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/store/InMemoryTokenStore.java),实现**访问**令牌和**刷新**令牌的存储。它会存在两个明显的**缺点**: - **重启**授权服务器时,令牌信息会**丢失**,导致用户需要重新授权。 - **多个**授权服务器时,令牌信息无法**共享**,导致用户一会授权成功,一会授权失败。 因此,下一篇[《芋道 Spring Security OAuth2 存储器》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-store/?self)文章,我们来学习 Spring Security OAuth 提供的基于**数据库**和 **Redis**的存储器。走起~
LazzMan
2024年4月30日 17:39
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码