【鉴权】深入解析OAuth 2.0:访问令牌与刷新令牌的安全管理
目录
- 引言
- 一、访问令牌(Access Token)
- 1.1 访问令牌概述
- 1.2 访问令牌的格式
- 1.2.1 JWT(JSON Web Token)
- 1.2.1.1 JWT 结构
- 1.2.1.2 示例 JWT
- 1.2.2 Bearer Token
- 1.3 访问令牌的有效期
- 1.4 访问令牌的工作流程
- 二、刷新令牌(Refresh Token)
- 2.1 刷新令牌概述
- 2.2 刷新令牌的工作机制
- 2.2.1 刷新令牌请求示例
- 2.2.2 刷新令牌响应示例
- 2.3 刷新令牌的安全性
- 2.4 刷新令牌的工作流程
- 三、访问令牌与刷新令牌的工作流程
- 3.1 工作流程
- 3.2 工作流程图
- 3.2 工作流程时序图
- 四、令牌生命周期与安全性考虑
- 4.1 访问令牌的生命周期
- 4.1.1 访问令牌的生成与有效期
- 4.1.2 访问令牌的存储与保护
- 4.1.3 访问令牌的使用与验证
- 4.1.4 访问令牌的过期与更新
- 4.2 刷新令牌的生命周期
- 4.2.1 刷新令牌的生成与有效期
- 4.2.2 刷新令牌的存储与保护
- 4.2.3 刷新令牌的安全问题与防护
- 4.3 令牌的安全性建议
- 4.3.1 令牌的加密存储与传输
- 4.3.2 令牌最小化原则
- 4.3.3 限制令牌的作用域与权限
- 4.3.4 定期检查与吊销令牌
- 4.3.5 实施多因素认证(MFA)
- 4.3.6 防范跨站请求伪造(CSRF)和跨站脚本攻击(XSS)
- 五、安全最佳实践
- 5.1 访问令牌与刷新令牌的安全性
- 5.1.1 加密存储与传输
- 5.1.2 短期有效期与自动刷新
- 5.1.3 刷新令牌失效机制
- 5.1.4 令牌撤销机制
- 5.2 防止令牌泄露
- 总结
引言
在现代网络安全和授权领域,OAuth 2.0 协议扮演着至关重要的角色,特别是在API授权、身份验证和会话管理等方面。作为OAuth 2.0协议的核心组成部分,**访问令牌(Access Token)和刷新令牌(Refresh Token)**不仅确保了客户端与资源服务器之间的安全通信,还提供了灵活的会话管理机制。访问令牌用于用户身份验证并授权访问特定资源,而刷新令牌则允许在令牌过期后自动获取新的访问令牌,从而避免频繁的登录操作并保持会话的持续性。
本文将深入探讨这两个关键概念的工作原理、格式和生命周期,重点讨论它们的安全性和最佳实践。通过合理设计令牌管理机制,开发者可以有效提升系统的安全性,同时优化用户体验。本篇文章旨在帮助开发者了解如何通过安全策略、最佳存储与传输实践,减少令牌泄露、滥用和伪造等风险,确保应用的安全性和稳定性。
一、访问令牌(Access Token)
1.1 访问令牌概述
访问令牌(Access Token) 是在 OAuth 2.0 协议中用于授权客户端访问受保护资源的凭证。它由授权服务器发放,并通过它来确认客户端是否有权访问特定的资源。
访问令牌通常具有较短的有效期,这使得它在保护资源时能够提供较高的安全性。访问令牌一旦过期,客户端必须使用 刷新令牌 获取新的访问令牌。
1.2 访问令牌的格式
OAuth 2.0 中的访问令牌有多种格式,最常见的两种格式是 JWT(JSON Web Token) 和 Bearer Token。
1.2.1 JWT(JSON Web Token)
JWT 是 OAuth 2.0 中常见的访问令牌格式,它是一种自包含的令牌格式。JWT 包含三部分:头部(Header)、载荷(Payload)和签名(Signature)。它的优势在于可以携带用户信息、权限以及其他元数据,而无需访问外部数据库进行验证。
1.2.1.1 JWT 结构
-
头部(Header):通常包含令牌的类型(JWT)和使用的签名算法(如 HMAC SHA256)。
{"alg": "HS256","typ": "JWT" } -
载荷(Payload):包含了需要传递的信息,例如用户标识符(
sub)、授权范围(scope)和其他与认证相关的数据。需要注意的是,JWT 载荷是未加密的,可以被任何人查看,但不可以篡改。{"sub": "1234567890","name": "John Doe","iat": 1516239022 } -
签名(Signature):通过签名算法对头部和载荷进行签名,保证令牌的完整性与真实性。签名方式通常如下:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
1.2.1.2 示例 JWT
假设你有一个 JWT 令牌,其结构如下所示:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
这个令牌由三部分组成,分别是 base64 编码后的头部、载荷和签名。你可以通过解码 JWT 查看其中的信息。
1.2.2 Bearer Token
Bearer Token 是另一种常见的访问令牌格式,通常它是一个简单的字符串,客户端在请求资源时将其放在 HTTP 请求的 Authorization header 中。
Authorization: Bearer <access_token>
Bearer Token 并不包含内部结构或加密,而是通过访问令牌验证机制确保其有效性。它的简单性使得它在快速集成的应用中非常流行,但它的安全性依赖于传输过程中的加密和存储策略。
1.3 访问令牌的有效期
访问令牌在 OAuth 2.0 中通常设置为较短的有效期,通常为 1 小时或更短。有效期设置较短是为了减少令牌被滥用的风险,特别是在可能被盗用的情况下。
访问令牌过期后,客户端将无法再访问受保护资源,需要使用刷新令牌重新获取新的访问令牌。
访问令牌有效期示例
通常,在 JWT 中,访问令牌会通过 exp 字段来表示过期时间:
{"exp": 1609459200, // 过期时间戳"sub": "user123", // 用户标识"scope": "read write"
}
在这个例子中,exp 字段的值表示令牌的过期时间。客户端可以根据当前时间与 exp 字段的值进行对比,判断令牌是否过期。
1.4 访问令牌的工作流程
- 客户端通过授权服务器获取访问令牌。
- 使用该访问令牌向资源服务器请求访问受保护资源。
- 资源服务器验证访问令牌的合法性,如果有效,返回资源数据。
- 如果访问令牌过期,客户端使用刷新令牌来获取新的访问令牌。
二、刷新令牌(Refresh Token)
2.1 刷新令牌概述
刷新令牌(Refresh Token) 是 OAuth 2.0 中用于获取新的访问令牌的凭证。与访问令牌不同,刷新令牌通常具有较长的有效期(几天、几周甚至更长时间)。刷新令牌在客户端使用时不会直接访问资源,而是用于在访问令牌过期时请求新的访问令牌。
2.2 刷新令牌的工作机制
当访问令牌过期后,客户端无需请求用户重新授权,只需要使用有效的刷新令牌向授权服务器请求新的访问令牌。
2.2.1 刷新令牌请求示例
客户端向授权服务器发送包含刷新令牌的请求,示例如下:
POST /oauth/token
Content-Type: application/x-www-form-urlencodedgrant_type=refresh_token&refresh_token=<refresh_token>&client_id=<client_id>&client_secret=<client_secret>
授权服务器验证刷新令牌是否有效,如果有效,则返回一个新的访问令牌及可能的新刷新令牌。
2.2.2 刷新令牌响应示例
{"access_token": "new_access_token","token_type": "bearer","expires_in": 3600,"refresh_token": "new_refresh_token"
}
2.3 刷新令牌的安全性
刷新令牌具有较长的有效期,因此它的安全性尤为重要。如果刷新令牌被盗,攻击者可以使用它持续获取新的访问令牌,进而访问用户数据。为了确保安全,刷新令牌的存储和传输需要格外谨慎。
刷新令牌的安全存储方式:
- 服务器端存储:刷新令牌可以保存在服务器端,客户端不保存刷新令牌。客户端每次请求新的令牌时,通过后端接口交换令牌。
- 加密存储:如果必须存储在客户端,则应对刷新令牌进行加密处理,确保其安全。
2.4 刷新令牌的工作流程
- 获取刷新令牌:授权服务器发放访问令牌和刷新令牌。
- 使用刷新令牌获取新令牌:访问令牌过期后,客户端使用刷新令牌向授权服务器请求新的访问令牌。
- 重新认证:如果刷新令牌失效,客户端必须重新请求用户授权。
三、访问令牌与刷新令牌的工作流程
在现代应用中,OAuth 2.0 和 OpenID Connect 协议被广泛应用来实现安全的身份认证和授权。为了提升用户体验与系统的安全性,通常会采用 访问令牌(Access Token) 和 刷新令牌(Refresh Token) 这两种令牌机制。访问令牌用于访问保护资源,而刷新令牌则用于在访问令牌过期时请求新的访问令牌。接下来,我们将通过流程图和详细说明,来展示这两种令牌在系统中的工作流程。
3.1 工作流程
1. 用户授权
在用户首次登录或访问需要授权的资源时,客户端应用会向授权服务器请求用户的授权。用户会被引导到授权服务器,并要求提供必要的认证信息(如用户名和密码)。
2. 授权服务器生成访问令牌与刷新令牌
一旦用户授权成功,授权服务器会生成两种令牌:
- 访问令牌(Access Token):它用于短时间内访问受保护的资源。通常具有较短的有效期(例如 1 小时)。
- 刷新令牌(Refresh Token):它用于在访问令牌过期后,重新获取新的访问令牌。刷新令牌通常有效期较长,甚至可以是永久有效。
3. 客户端收到令牌
授权服务器将生成的访问令牌和刷新令牌返回给客户端。客户端将这些令牌保存在本地(如存储在浏览器的 localStorage 或移动设备的安全存储中)。
4. 客户端请求资源
客户端应用需要访问受保护的资源时,它会将访问令牌附带在 HTTP 请求头中,发送到资源服务器。
5. 资源服务器验证访问令牌
资源服务器收到客户端请求后,首先会验证访问令牌的有效性。如果令牌有效,它将允许访问对应的资源。
6. 返回资源
如果访问令牌有效,资源服务器会将请求的资源返回给客户端。
7. 访问令牌过期
访问令牌是有有效期的,通常会在一段时间后过期。当客户端尝试使用已过期的访问令牌访问资源时,资源服务器会拒绝请求,提示令牌过期。
8. 客户端使用刷新令牌请求新令牌
当访问令牌过期时,客户端会使用之前获取到的刷新令牌,向授权服务器请求一个新的访问令牌。
9. 授权服务器验证刷新令牌
授权服务器会验证刷新令牌是否有效。如果有效,授权服务器会生成新的访问令牌(以及可能的新刷新令牌),并返回给客户端。
10. 客户端重新请求资源
客户端使用新的访问令牌重新请求资源。如果刷新令牌本身也过期或失效,客户端可能需要重新引导用户进行授权。
11. 刷新令牌失效,重新授权
如果刷新令牌过期或被吊销,客户端需要引导用户重新进行授权,重新获取一对新的访问令牌和刷新令牌。
3.2 工作流程图
整个工作流程可以用以下图示展示,简要说明每个步骤的交互和关系:
在上面的流程图中,我们能够看到:
- 用户首先授权客户端访问。
- 授权服务器生成并返回访问令牌与刷新令牌。
- 客户端使用访问令牌请求资源,并由资源服务器验证该令牌。
- 当访问令牌过期时,客户端通过刷新令牌请求新的访问令牌。
- 如果刷新令牌失效,客户端需要重新授权。
3.2 工作流程时序图
为了进一步清晰地展示访问令牌和刷新令牌的工作流程,我们将这个流程转化为一个时序图(sequence diagram)。时序图能够很好地展现参与者之间的交互顺序及其生命周期。以下时序图展示了访问令牌和刷新令牌的交互过程:
在时序图中,我们能够看到:
- 用户授权流程,客户端请求授权并得到访问令牌和刷新令牌。
- 客户端用访问令牌请求资源,资源服务器验证并返回资源。
- 访问令牌过期后,客户端使用刷新令牌请求新的访问令牌。
- 授权服务器验证刷新令牌并返回新的令牌。
- 客户端再次使用新令牌请求资源。
- 如果刷新令牌失效,客户端需要重新引导用户进行授权。
四、令牌生命周期与安全性考虑
在现代应用中,令牌(Token)作为身份验证和授权的核心组件,起到了至关重要的作用。为了确保令牌在使用过程中的安全性,我们需要考虑令牌的生命周期管理和如何有效防止潜在的安全威胁。令牌包括访问令牌(Access Token)和刷新令牌(Refresh Token),两者在生命周期管理和安全防护上的策略有所不同。本章将详细探讨这两类令牌的生命周期及安全性措施,涵盖令牌的生成、存储、传输、过期、吊销等关键环节,并为实现更高安全性提供实践指导。
4.1 访问令牌的生命周期
4.1.1 访问令牌的生成与有效期
访问令牌通常在用户成功认证后由身份提供方(如 OAuth2 或 OpenID Connect 服务)生成。生成的令牌包含用户的身份信息以及相关授权信息,通常会采用 JWT(JSON Web Token)格式。访问令牌的有效期一般较短,通常为1小时到24小时不等。短生命周期的设计是为了减少令牌被滥用的风险。
访问令牌的生命周期
| 事件 | 描述 | 时间 |
|---|---|---|
| 认证成功 | 用户成功登录系统后,身份提供方生成访问令牌 | - |
| 使用访问令牌 | 用户访问受保护资源,令牌在请求中携带 | 1小时至24小时 |
| 令牌过期或失效 | 令牌超出有效期,不能再使用 | 到期时 |
| 重新认证或刷新令牌 | 用户需要重新登录或使用刷新令牌更新访问令牌 | 用户重新认证或刷新 |
4.1.2 访问令牌的存储与保护
访问令牌通常存储在客户端应用中,常见的存储方式有两种:
-
浏览器端存储:
- 存储位置: 使用
HTTP-onlyCookie 或localStorage。 - 安全措施: 存储在
HTTP-onlyCookie 中能够防止 JavaScript 访问令牌,有效防止 XSS 攻击。 - 建议: 配置
Secure标志,确保令牌仅通过 HTTPS 传输,防止中间人攻击(MITM)。
- 存储位置: 使用
-
移动端存储:
- 存储位置: 在 iOS 中使用 Keychain,在 Android 中使用 Keystore。
- 安全措施: 这些平台提供了加密存储功能,能有效保护令牌。
4.1.3 访问令牌的使用与验证
访问令牌的使用场景主要是通过 API 请求访问受保护资源。每次请求时,客户端将令牌作为 Authorization 头部(Bearer <token>)传送给服务器。服务器会验证令牌的有效性,如果令牌有效,允许用户访问资源,否则返回错误响应。
Authorization: Bearer <access_token>
4.1.4 访问令牌的过期与更新
访问令牌一般设定较短的有效期,以限制被滥用的窗口。过期后的令牌会被拒绝使用。常见的解决方式是使用 刷新令牌(Refresh Token) 机制,即通过持有有效的刷新令牌来获取新的访问令牌,延续会话而不需要重新认证。
4.2 刷新令牌的生命周期
4.2.1 刷新令牌的生成与有效期
刷新令牌的有效期通常较长,可能是数天、数月甚至长期有效。刷新令牌的主要作用是当访问令牌过期时,能够使用它来获取新的访问令牌。为了避免刷新令牌长期有效导致的安全问题,可以设置合理的过期时间并在一定条件下强制吊销。
刷新令牌的生命周期
| 事件 | 描述 | 时间 |
|---|---|---|
| 刷新令牌生成 | 访问令牌过期,刷新令牌生成 | 1天至数月 |
| 刷新令牌使用 | 使用刷新令牌获取新访问令牌 | 每次访问令牌过期时 |
| 刷新令牌过期或吊销 | 刷新令牌失效,用户需要重新认证 | 按设定时间或异常事件 |
| 重新认证 | 令牌失效后强制用户重新认证 | 用户手动重新认证 |
4.2.2 刷新令牌的存储与保护
由于刷新令牌的有效期较长,它的安全性要求更加严格。应避免刷新令牌泄露,否则攻击者可以长时间持有有效令牌。因此,刷新令牌应当与访问令牌一起加密存储,并且最好设置 SameSite 属性以防止 CSRF 攻击。
4.2.3 刷新令牌的安全问题与防护
刷新令牌长期有效可能带来更高的安全风险,因此必须采取措施确保其安全性:
- 吊销机制: 在检测到异常行为(如用户密码更改、IP地址变动等)时应吊销刷新令牌。
- 短生命周期刷新令牌: 尽量将刷新令牌的有效期缩短,定期更新刷新令牌。
4.3 令牌的安全性建议
为了确保令牌在生命周期内的安全性,应遵循以下安全措施:
4.3.1 令牌的加密存储与传输
- 加密存储:令牌应存储在安全的存储机制中,避免暴露。对于 Web 应用,使用
HTTPOnly和Secure标志的 cookies,使令牌无法被浏览器中的 JavaScript 访问。对于移动应用,使用系统的安全存储 API(如 iOS 的 Keychain 或 Android 的 Keystore)存储令牌。 - 加密传输:所有与令牌相关的通信必须通过 HTTPS 协议加密,以防止中间人攻击(MITM)。确保令牌在网络传输过程中无法被窃取。
4.3.2 令牌最小化原则
令牌应仅包含进行身份验证和授权所需的最小信息,避免将敏感数据(如个人信息)嵌入令牌中。通过实现令牌最小化,可以有效降低令牌泄露后可能造成的损失。令牌的作用范围和功能应尽可能精简,只授予用户最必要的权限。
4.3.3 限制令牌的作用域与权限
通过精确控制令牌的权限和作用范围,可以确保令牌仅访问必要的资源。使用 OAuth2 的作用域(Scope)机制对令牌的权限进行限制,防止过度授权。特别是在多用户环境中,限制每个令牌的权限范围至关重要,它能有效防止权限过大导致的安全问题。例如:
| 作用域 | 说明 |
|---|---|
read | 只允许访问资源的读取权限 |
write | 允许修改资源的权限 |
admin | 允许访问管理员权限的资源 |
4.3.4 定期检查与吊销令牌
- 定期检查:定期检查令牌的有效性,发现过期或可疑的令牌应及时吊销。
- 安全事件检测:结合安全事件(如登录异常、IP 地址变化、频繁的认证失败等)监测,及时吊销潜在的滥用令牌。
- 令牌撤销机制:当用户注销、修改密码或更改权限时,立即使相关令牌失效,防止令牌被盗用。
4.3.5 实施多因素认证(MFA)
多因素认证(MFA)是增强令牌安全性的有效措施,即使令牌被攻击者窃取,缺少第二重身份验证(如短信验证码或生物识别)仍无法访问系统。通过要求用户提供第二重身份验证(如短信验证码、动态口令、指纹识别等),可以显著提高令牌的安全性,降低令牌被盗用的风险。MFA 是一种有效的补充措施,特别是在处理高风险操作时尤为重要。
4.3.6 防范跨站请求伪造(CSRF)和跨站脚本攻击(XSS)
- 防范 CSRF:在每个请求中添加随机令牌(CSRF Token)和确保浏览器发送的 cookie 有 SameSite 属性来验证请求来源,防止跨站请求伪造(CSRF)攻击。
- 防范 XSS:严格过滤和验证用户输入,防止跨站脚本(XSS)攻击,避免恶意脚本窃取存储在浏览器中的令牌。
五、安全最佳实践
5.1 访问令牌与刷新令牌的安全性
确保 OAuth 2.0 系统的访问令牌和刷新令牌安全,以下是具体的最佳实践:
5.1.1 加密存储与传输
- 令牌加密存储:确保访问令牌与刷新令牌在客户端存储时使用安全存储机制,如
HTTPOnly和Securecookies(Web)或 iOS Keychain/Android Keystore(移动应用)。 - 使用 HTTPS:所有通信都应通过 HTTPS 加密传输,防止令牌在传输过程中被拦截。
5.1.2 短期有效期与自动刷新
- 短期访问令牌:访问令牌应设置较短的有效期(如 15 分钟或 1 小时),有效期到期后通过刷新令牌获取新的访问令牌。
- 自动刷新机制:客户端应实现自动刷新机制,在令牌过期前自动使用刷新令牌获取新的访问令牌,确保无缝用户体验。
5.1.3 刷新令牌失效机制
- 刷新令牌失效:用户登出、密码修改或权限变更时,应立即使刷新令牌失效,以防止攻击者通过被盗的刷新令牌持续访问。
- 最小权限原则:访问令牌和刷新令牌应仅授予最小权限,降低潜在风险。
5.1.4 令牌撤销机制
- 令牌撤销:当用户撤销授权或注销时,立即使相关令牌失效。授权服务器应支持令牌撤销功能,以实时反映用户授权状态。
5.2 防止令牌泄露
令牌泄露是 OAuth 2.0 系统中的重大安全风险,以下是防护措施:
-
避免在 URL 中传递令牌:不应通过 URL 参数传递访问令牌或刷新令牌,因为 URL 可能被浏览器缓存、记录或通过第三方工具捕获。推荐通过请求头中的
Authorization字段传递令牌:Authorization: Bearer <access_token> -
令牌过期处理:设置较短的令牌过期时间(如 15 分钟),减少令牌泄露的滥用窗口。如果使用 JWT 类型令牌,令牌泄露后攻击者只能在短时间内滥用。
-
防范 CSRF 和 XSS 攻击:通过设置
SameSite属性增强浏览器对 cookies 的安全性,并使用 CSRF Token 防止跨站请求伪造(CSRF)攻击;严格验证和过滤用户输入,防止跨站脚本(XSS)攻击。
总结
在现代Web与移动应用开发中,访问令牌(Access Token)与刷新令牌(Refresh Token)是确保身份验证和授权的核心机制。正确理解并合理设计它们的生命周期和安全策略,是保障用户数据与系统资源安全的关键。
访问令牌通常用于授权客户端访问受保护资源,其有效期较短,旨在减少潜在的安全风险。而刷新令牌则用于在访问令牌过期后,获取新的访问令牌,确保用户不需要频繁登录,提升用户体验。为了保证令牌的安全性,开发者应采取一系列措施,如使用 HTTPS 加密通信、存储令牌时确保安全性、采用短期有效的访问令牌并实现自动刷新机制、实施令牌撤销和最小权限原则等。
通过加密存储令牌、限制令牌权限范围、定期检查令牌的有效性、结合多因素认证等策略,可以有效防止令牌被滥用或泄露,从而保障系统的安全性与稳定性。综上所述,合理的令牌管理和最佳安全实践是构建安全可靠OAuth 2.0 授权系统的基础。
相关文章:
【鉴权】深入解析OAuth 2.0:访问令牌与刷新令牌的安全管理
目录 引言一、访问令牌(Access Token)1.1 访问令牌概述1.2 访问令牌的格式1.2.1 JWT(JSON Web Token)1.2.1.1 JWT 结构1.2.1.2 示例 JWT 1.2.2 Bearer Token 1.3 访问令牌的有效期1.4 访问令牌的工作流程 二、刷新令牌(…...
【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单
在数字技术迅猛发展的今天,人工智能(AI)的应用已经渗透到了我们生活的方方面面,从日常的语音助手到复杂的图像处理,无不体现着AI技术的魅力。特别是在娱乐和创意领域,AI技术更是展现出了惊人的潜力。其中&a…...
限界上下文(Bounded Context)
限界上下文(Bounded Context):领域驱动设计中的重要概念 在领域驱动设计(Domain-Driven Design, DDD)中,限界上下文(Bounded Context)是一个非常重要的概念。限界上下文定义了一个特定领域模型的边界,确保在这个边界内,领域模型的术语、规则和逻辑是一致的。通过明确…...
20241105专家访谈学习资料
“两性一度” 即高阶性、创新性、挑战度。“三性一度”是指教学目标的适应性、教学内容的先进性、教学实施的实践性及教学评价的有效度。“四性一度”是指系统性、层次性、前瞻性、专业性以及培养目标达成度。“二性一度”用词比较规范、标准统一,“三性一度”和“四…...
Docling:开源的文档解析工具,支持多种格式的解析和转换,可与其他 AI 工具集成
❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号ÿ…...
oracle如何在不同业务场景下正确使用聚合查询、联合查询及分组查询?
引言 在数据库管理系统中,SQL(结构化查询语言)是用于与数据库进行交互的标准语言。 Oracle数据库作为一种广泛使用的关系数据库管理系统,提供了丰富的SQL功能,包括聚合查询、联合查询和分组查询等。 这些功能在数据…...
Hearts of Iron IV 之 Archive Modification
存档位置 C:\Users\XXX\Documents\Paradox Interactive\Hearts of Iron IV\save games 打开文档 打开C:\Users\XXX\Documents\Paradox Interactive\Hearts of Iron IV\settings.txt,将save_as_binaryyes 改成save_as_binaryno,然后退出游戏重新存档&a…...
python manage.py下的命令及功能
python manage.py 是 Django 框架中用于管理 Django 项目的命令行工具 1、startapp: 功能:创建一个新的 Django 应用程序。 用法:python manage.py startapp appname 示例:python manage.py startapp blog 2、startproject&a…...
建筑行业员工离职SOP的数字化管理
在建筑行业,随着数字化转型的深入,对员工离职的标准操作程序(SOP)进行数字化管理变得尤为重要。这不仅有助于提高管理效率,还能确保离职流程的规范性和合规性。本文将探讨建筑行业如何通过数字化手段管理员工离职SOP&a…...
江协科技STM32学习- P30 FlyMCU串口下载STLink Utility
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
05LangChain实战课 - 提示工程与FewShotPromptTemplate的应用
LangChain实战课 - 提示工程与FewShotPromptTemplate的应用 提示工程的重要性 在LangChain框架中,提示工程是构建有效大模型应用的关键。通过精心设计的提示,我们可以引导大语言模型(LLM)生成预期的输出。本节课深入探讨了如何利…...
【数据处理】数据预处理·数据变换(熵与决策树)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必备知识_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...
UE5 随机生成地牢关卡
参考视频:【UE5 | 教程 | 地编】虚幻引擎5 中创建史诗级 程序化 地下城_哔哩哔哩_bilibili 首先创建一个父项Actor 这个BOX碰撞提是和地板重叠的 这三个是场景组件,这个ExitsFolder下面的箭头等会会在子蓝图中添加 接下来创建BP_MasterRoom的子蓝图&…...
【Cpp】命名空间
前言 在C语言中,命名冲突通常发生在不同的作用域中使用了相同的标识符: 全局变量和局部变量同名: 如果在全局作用域和局部作用域中都定义了同名的变量,那么在局部作用域中,全局变量会被局部变量遮蔽。 int globalVar; // 全局变量…...
ESP32学习笔记——LOG日志库的使用
注:本文由CHATGPT辅助创作,未经验证,实际工程使用请仔细甄别。 对于设置日志级别的几种方式(esp_log_level_set、CONFIG_LOG_DEFAULT_LEVEL、CONFIG_LOG_MAXIMUM_LEVEL、LOG_LOCAL_LEVEL )容易混淆,特此学习…...
51c~C语言~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12428240 一、C语言和C的区别 C语言虽说经常和C在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C是C99标准的。C89就是在1989年制定的标准,如今最新…...
$nextTick 实现原理
Vue 使用 nextTick 来确保数据更新后的 DOM 操作在更新完成后执行。其核心逻辑是将回调放到微任务或宏任务队列中,确保回调在 DOM 更新完成后执行。 Vue.js 会利用不同的浏览器 API 来模拟 nextTick 的延迟执行,通常是通过: Promise&#x…...
kelp protocol
道阻且长,行而不辍,未来可期 有很长一段时间我都在互联网到处拾金,but,东拼西凑的,总感觉不踏实,最近在老老实实的看官方文档 & 阅读白皮书 &看合约,挑拣一些重要的部分配上官方的证据,和过路公主or王子分享一下,愿我们早日追赶上公司里那些可望不可及大佬们。…...
Golang--面向对象
Golang语言面向对象编程说明: Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class),Go语言的结构体(struct)和其…...
深度学习经典模型之LeNet-5
1 LeNet-5 1.1 模型介绍 LeNet-5是由 L e C u n LeCun LeCun 提出的一种用于识别手写数字和机器印刷字符的卷积神经网络(Convolutional Neural Network,CNN) [ 1 ] ^{[1]} [1],其命名来源于作者 L e C u n LeCun LeCun的名字…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
