第2章_保护您的第一个应用程序
第2章_保护您的第一个应用程序
在本章中,您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣,您将运行的示例应用程序由两部分组成,前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证,以及它如何安全地调用后端。
在本章结束时,您将基本了解 Keycloak 如何利用 OpenID Connect 保护应用程序。
在本章中,我们将介绍以下主要主题:
理解示例应用程序
-
运行应用程序
-
了解如何登录应用程序
-
安全调用后端 REST API
技术要求
要运行本章中包含的示例应用程序,您需要在工作站上安装 Node. js(https://nodejs.org/)。
您还需要拥有与本书关联的 GitHub 存储库的本地副本。如果您安装了 Git,您可以通过在终端中运行以下命令来克隆存储库:
$ git clone https://github.com/PacktPublishing/Keycloak---Identity-and-Access-Management-for-Modern-Applications-2nd-Edition.git
或者,您可以从https://github.com/PacktPublishing/Keycloak—Identity-and-Access-Management-for-Modern-Applications-2nd-Edition下载存储库的 ZIP。
查看以下链接以查看 Code in Action 视频:https://packt.link/oxOr8
了解示例应用程序
示例应用程序由两部分组成 —— 前端 Web 应用程序和后端 REST API。
前端 Web 应用程序是一个用 JavaScript 编写的单页应用程序。由于我们想关注 Keycloak 可以提供什么,因此该应用程序非常简单。此外,为了使运行应用程序尽可能简单,它使用 Node. js。该应用程序提供以下功能:
-
使用 Keycloak 登录。
-
显示用户名。
-
会显示用户的个人资料图片(如果有)。
-
显示 ID 令牌。
-
显示访问令牌。
-
刷新令牌。
-
调用后端提供的安全端点。
后端 REST API 也很简单,是用 Node. js 实现的。它提供了一个具有两个端点的 REST API:
-
/public:没有安全性的公开可用端点
-
/secured:一个需要具有 myReal 全局角色的访问令牌的安全端点
Node. js 用于示例应用程序,因为我们希望使代码尽可能易于理解和运行,无论您熟悉什么编程语言。
下图显示了前端、后端和 Keycloak 之间的关系。前端使用 Keycloak 对用户进行身份验证,然后调用后端,后端使用 Keycloak 验证是否允许请求:
图 2.1:应用概述
现在您已经对示例应用程序有了基本的了解,让我们看一些关于这一切是如何结合在一起的更多细节。
当用户单击前端应用程序中的登录按钮时,浏览器将被重定向到 Keycloak 登录页面。然后,用户使用 Keycloak 进行身份验证,然后浏览器使用称为授权码的特殊代码重定向回应用程序。然后,应用程序调用 Keycloak 将授权码交换为以下令牌:
-
ID 令牌:这提供了与经过身份验证的用户有关的应用程序信息。
-
访问令牌:应用程序在向服务发出请求时包含此令牌,允许服务验证是否应允许请求。
-
刷新令牌:ID 和访问令牌都有很短的过期时间 —— 默认情况下为 5 分钟。应用程序使用刷新令牌从 Keycloak 获取新令牌。
描述的流程就是 OpenID Connect 中所谓的授权代码流程。如果您还不熟悉 OAuth 2.0 或 OpenID Connect,它们起初可能有点令人生畏,但一旦您熟悉它们,它们实际上非常简单易懂。
为了帮助可视化登录过程,提供了如下简化时序图:
图 2.2:简化的 OpenID Connect 中的授权代码流程
此图中的步骤如下:
-
用户点击登录按钮。
-
应用程序重定向到 Keycloak 登录页面。
-
Keycloak 登录页面显示给用户。
-
用户填写用户名和密码并将结果提交给 Keycloak。
-
验证用户名和密码后,Keycloak 将授权码发送给应用程序。
-
应用程序将授权码交换为 ID 令牌和访问令牌。应用程序现在可以通过检查 ID 令牌来验证用户的身份。
通过将用户的身份验证委托给 Keycloak,应用程序不必知道如何对用户进行身份验证。当身份验证机制发生变化时,这一点尤其重要。例如,无需更改应用程序即可启用双重验证。这也意味着应用程序无权访问用户的凭据。
与 Keycloak 相关的下一步是前端调用后端。后端 REST API 有一个受保护的端点,只能由具有全局角色 myorn 的用户调用。
为了完全准确,前端被授予代表用户调用后端的权限。这是 OAuth 2.0 美妙之处的一部分。应用程序没有权限做用户能够做的所有事情,只有它应该能够做的事情。
当前端向后端发出请求时,它会在请求中包含访问令牌。默认情况下,Keycloak 使用 JSON Web 签名(JWS)作为令牌格式。这些类型的令牌通常被称为非不透明令牌,这意味着令牌的内容对应用程序直接可见。
令牌还包括一个数字签名,使得验证令牌确实是由 Keycloak 发行的成为可能。本质上,这意味着后端可以验证令牌并读取内容,而无需向 Keycloak 发出请求,从而减少对 Keycloak 服务器的需求,并降低处理后端请求时的延迟。
为了帮助可视化前端向后端发送请求时会发生什么,请查看下图:
图 2.3:从前端到后端的安全请求简化
图中的步骤如下:
-
后端检索 Keycloak 的公钥。后端不需要对后端的所有请求执行此操作,而是可以将密钥缓存在内存中。
-
前端向后端发送请求,包括访问令牌。
-
后端使用之前检索到的公钥来验证访问令牌是否由受信任的 Keycloak 实例颁发,然后验证令牌是否有效并且令牌包含角色 my 角色。
-
后端将结果返回给前端。
您现在对如何使用 Keycloak 保护示例应用程序有了基本的了解。在下一节中,您将学习如何运行示例应用程序。
运行应用程序
在本节中,您将学习如何运行示例应用程序。
如果您的工作站上还没有安装 Node. js,请转到https://nodejs.org/以获取有关如何安装它的说明。
要在 Node.js 上运行前端,请打开终端并运行以下命令:
$ cd Keycloak---Identity-and-Access-Management-for-Modern-Applications-2nd-Edition/ch2/frontend/
$ npm install
$ npm start
接下来,使用以下命令打开一个新终端以运行后端:
$ cd Keycloak---Identity-and-Access-Management-for-Modern-Applications-2nd-Edition/ch2/backend/
$ npm install
$ npm start
现在您已经使用 Node. js 运行了示例应用程序,您可以使用 Keycloak 注册它,我们将在下一节中介绍。
了解如何登录应用程序
在上一章中,介绍了如何开始使用 Keycloak,您学习了如何运行 Keycloak,以及如何创建您的第一个领域。在继续本节之前,您应该让 Keycloak 在创建的领域中运行,如上一章所述。总之,在继续之前,您需要以下内容:
-
Keycloak启动并运行
-
一个为myrealm的领域
-
一个为 myrole 的全局角色
-
具有上述角色的用户
在应用程序可以使用 Keycloak 登录之前,它必须使用 Keycloak 注册为客户端。在注册前端之前,让我们看看如果未注册的应用程序尝试使用 Keycloak 进行身份验证会发生什么。打开http://localhost:8000,然后单击登录按钮。您将看到来自 Keycloak 的错误页面,其中显示未找到客户端消息。此错误告诉您该应用程序未使用 Keycloak 注册。
要使用 Keycloak 注册前端,请打开 Keycloak 管理控制台。在左侧菜单的顶部,有一个选项可以选择您正在使用的领域。确保您选择了名为 mydomain 的领域。在左侧菜单中,单击客户端,然后单击创建客户端。
用以下值填写表单:
- Client ID:myclient
填写 Client ID 字段后,单击 Next。在以下屏幕上,可以启用和禁用应用程序所需的各种功能。现在,您可以简单地忽略此步骤并单击保存。
在前端应用程序可以使用客户端使用 Keycloak 进行身份验证之前,您必须注册应用程序的 URL。在访问设置下,填写以下值:
- Valid redirect URIs: http://localhost:8000/
- Valid post redirect URIs: http://localhost:8000/
- Web origins: http://localhost:8000
填写表单后,单击保存。在我们继续尝试使用前端应用程序登录之前,让我们进一步了解您输入的最后一个配置值的含义:
-
Valid redirect URIs:当使用客户端应用程序时,此值在 OpenID Connect 授权代码流中非常重要。客户端应用程序无法拥有任何凭据,因为它们对应用程序的最终用户是可见的。为了防止任何恶意应用程序伪装成真正的应用程序,有效的重定向 URI 指示 Keycloak 仅将用户重定向到与有效重定向 URI 匹配的 URL。在这种情况下,由于该值设置为
-
Valid post redirect URIs:用于配置登出请求的重定向 URL,和登录时的重定向 URL 类似。Keycloak 支持设置特殊值 “+” ,表示允许所有有效的重定向 URI 作为登出时的重定向地址。
-
Web origins:此选项为跨域资源共享(CORS)请求注册应用程序的有效 Web 来源。要从 Keycloak 获取令牌,前端应用程序必须向 Keycloak 发送 AJAX 请求,浏览器不允许从一个 Web 来源到另一个 Web 来源的 AJAX 请求,除非使用 CORS。Keycloak 支持添加一个值为 + 的特殊 Web 来源,这导致允许所有有效的重定向 URI 作为 Web 来源。
以下屏幕截图显示了 Keycloak 管理控制台中创建的客户端。
图 2.4:管理控制台中的客户端设置
现在您可以通过打开http://localhost:8000返回前端。这次,当您单击登录按钮时,您将看到 Keycloak 登录页面。使用您在上一章中创建的用户名和密码登录。
让我们看看 Keycloak 发行的 ID 令牌。单击 Show ID Token 按钮。显示的 ID 令牌如下所示:
{"exp": 1664300152,"iat": 1664299852,"auth_time": 1664298915,"jti": "21bb9f32-98ce-49aa-896d-796cb716be59","iss": "http://localhost:8080/realms/myrealm","aud": "myclient","sub": "eb14ea82-45e2-4413-8997-129fd0fc865b","typ": "ID","azp": "myclient","nonce": "ccf5f374-aa07-4280-b63a-efdba9c355c9","session_state": "22884115-55cb-4285-ba92-26c4bf74f74b","at_hash": "ngdMORpXQcEQJ6d9s3uHvw","acr": "0","sid": "22884115-55cb-4285-ba92-26c4bf74f74b","email_verified": true,"name": "Stian Thorgersen","preferred_username": "st","given_name": "Stian","family_name": "Thorgersen","email": "st@localdomain.localhost"
}
以下是 ID 令牌中一些更有趣的值的列表:
-
exp:这是自 01/01/197000:00:00 UTC(通常称为 Unix 或 Epoch 时间)以来令牌以秒为单位到期的日期和时间。
-
ISS:这是令牌的发行者,您可能会注意到它是 Keycloak 领域的 URL。这个信息有助于验证令牌的来源可靠性,应用可以通过确认 iss 字段的值是否是信任的 Keycloak 领域 URL,来判断该令牌是否是由合法的 Keycloak 实例颁发的,从而增强认证的安全性。
-
sub:这是经过身份验证的用户的唯一标识符。在整个系统中,无论用户的其他信息(如用户名、姓名等)如何变化,sub 字段始终保持不变,具有稳定性和唯一性。因此在应用开发中,常将 sub 字段作为识别用户的关键标识,用于关联用户的各类数据和权限信息。
-
name:这是经过身份验证的用户的名字和姓氏。用于直观展示用户的姓名信息。在一些需要显示用户真实姓名的场景,如用户个人资料页面、欢迎提示等地方,这个字段提供了直接可用的用户姓名数据。
-
preferred_username:代表认证用户的用户名,但不建议将其作为用户的唯一标识或关键引用。因为用户名具有可变性,用户可能会更改自己的用户名,而且在某些情况下,可能会出现用户名被重新分配给其他用户的情况。相比之下,sub 字段更适合作为用户的唯一标识,在涉及用户身份验证、权限管理和数据关联等操作时,使用 sub 字段能确保数据的准确性和一致性 。
应用程序使用 ID 令牌来建立经过身份验证的用户的身份。
接下来,让我们看看访问令牌。单击显示访问令牌按钮。让我们也看看这个令牌中的一些字段:
-
allowed-origins:这是应用程序允许的 Web 来源列表。后端服务在决定是否应允许 CORS 请求使用 Web 来源时可以使用此字段。
-
realm_access:这包含全局领域角色列表。它是授予用户的角色和客户端有权访问的角色之间的交集。
-
resource_access:包含客户端角色列表,用于确定用户在特定客户端相关资源上的访问权限,与具体客户端的资源访问控制紧密相关。
-
scope:作用有两个,一是决定令牌中包含哪些字段或声明;二是供后端判断该令牌可以访问哪些 API,在控制 API 访问权限方面发挥关键作用。
目前,令牌中的信息是 Keycloak 中可用的默认字段。如果您想添加其他信息,Keycloak 非常灵活,允许您自定义令牌中的内容。
让我们通过为用户添加图片来尝试一下。保持前端打开的选项卡,然后使用 Keycloak 管理控制台打开一个新选项卡。在左侧的菜单中,单击Users,并选择您之前创建的用户。现在让我们为用户添加一个自定义属性。单击Attributes。在表格中,底部将有两个空的输入字段。在关键列中,将值设置为图片,在值列中,将值设置为个人资料图片的 URL(在下面的屏幕截图中,我使用了我的 GitHub 头像)。然后,单击Save。
图 2.5:向用户添加自定义属性
现在,回到打开前端的选项卡。要显示个人资料图片,您可以单击刷新按钮。当您单击此按钮时,令牌将被刷新,新的 ID 令牌现在将包含您刚刚添加的图片属性,它允许应用程序为用户显示个人资料图片。
接下来,您将学习如何从前端安全地调用后端。
安全调用后端 REST API
现在,打开http://localhost:3000/并单击公共端点链接。您将看到一条消息说Public message!。公共端点不受 Keycloak 保护,无需访问令牌即可调用。
接下来,让我们尝试受 Keycloak 保护的安全端点。再次打开http://localhost:3000。这一次,单击安全端点链接。现在您将看到一条消息说 Access denied.。此请求不允许,因为它需要有效的访问令牌来调用端点。
现在让我们尝试从前端调用安全端点。打开http://localhost:8000/并单击调用服务。您现在将看到一条消息显示Secret message!。如果相反,您收到消息Access Denied,这很可能是由用户没有 my 角色引起的。
当单击调用服务时,前端会向后端服务发送 AJAX 请求,包括请求中的访问令牌,这允许后端验证调用是否代表具有访问端点所需角色的用户完成。
小结
在本章中,您学习了如何保护您的第一个应用程序,该应用程序由前端 Web 应用程序和带有 Keycloak 的后端 REST API 组成。您还基本了解了 Keycloak 如何利用 OpenID Connect 以标准和安全的方式实现这一切。加上您在本书第一章中学到的知识,您现在已经有了开始学习更多关于 Keycloak 的坚实基础。
在下一章中,我们将深入探讨使用 Keycloak 保护应用程序,让您更好地了解它是如何工作的。
问题
-
应用程序如何使用 Keycloak 进行身份验证?
-
您需要在 Keycloak 管理控制台中配置什么才能允许应用程序使用 Keycloak 进行身份验证?
-
应用程序如何安全地调用受保护的后端服务?
相关文章:
第2章_保护您的第一个应用程序
第2章_保护您的第一个应用程序 在本章中,您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣,您将运行的示例应用程序由两部分组成,前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证࿰…...
山东大学软件学院人工智能导论实验之知识库推理
目录 实验目的: 实验代码: 实验内容: 实验结果 实验目的: 输入相应的条件,根据知识库推理得出相应的知识。 实验代码: def find_data(input_process_data_list):for epoch, data_process in enumerat…...
Java 网络协议面试题答案整理,最新面试题
TCP和UDP的主要区别是什么? TCP(传输控制协议)和UDP(用户数据报协议)的主要区别在于TCP是面向连接的协议,而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。 1、连接…...
win10把c盘docker虚拟硬盘映射迁移到别的磁盘
c盘空间本身就比较小、如果安装了docker服务后,安装的时候没选择其他硬盘,虚拟磁盘也在c盘会占用很大的空间,像我的就三十多个G,把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...
AOP进阶-02.通知顺序
一.通知顺序 当有多个切面类中的切入点表达式一样时,这些切面类的执行顺序是怎样的呢?如图我们将定义两个切面类,一个MyAspect2,一个MyAspect3,一个MyAspect4。执行后我们发现, 对于目标方法前的通知方法&…...
${sym} 与 String(sym) 的区别
在 JavaScript 中,${sym}(模板字符串插值)和 String(sym)(显式类型转换)虽然都涉及将值转换为字符串,但它们的底层逻辑和行为存在显著差异,尤其是在处理 Symbol 等特殊类型时。以下是具体对比&a…...
sglang框架源码笔记
文章目录 整体架构1. **客户端(Client)**:2. **服务器端(Server)**:3. **调度器与模型工作节点(Scheduler & Model Worker)**: TpModelWorker类ModelRunner类TpModel…...
2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码
一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法(Chaotic Evolution Optimization, CEO)是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…...
uake 网络安全 reverse网络安全
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 本文首发于“合天网安实验室” 首先从PEID的算法分析插件来介绍,要知道不管是在CTF竞赛的REVERSE题目中,还是在实际的商业产品中…...
C语言实现单链表
单链表是数据结构中最基础的链式结构,它不按照线性的顺序存储数据,而是由若干个同一结构类型的“节点”依次串联而成的,即每一个节点里保存着下一个节点的地址(指针)。 上图中,一个表头变量head是用来存储链表首节点的地址,链表中每个节点有data(数据)部分和n…...
Rk3568驱动开发_点亮led灯代码完善(手动挡)_6
1.实现思路: 应用层打开设备后通过write函数向内核中写值,1代表要打开灯,0代表要关闭灯 Linux配置gpio和控制gpio多了一个虚拟内存映射操作 2.注意事项: 配置和读写操作的时候要谨慎,比如先关掉gpio再注销掉虚拟内存…...
threejs:document.createElement创建标签后css设置失效
vue3threejs,做一个给模型批量CSS2D标签的案例,在导入模型的js文件里,跟着课程写的代码如下: import * as THREE from three; // 引入gltf模型加载库GLTFLoader.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.…...
在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间
在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration,这个对象里面有compareDate字段,刚好表格查询的对象也是FakeRegistration,所以表格展示的时间就是刚才…...
使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器
随着deepseek,chatgpt等大模型的能力越来越强大,本文将介绍借助deepseek,chatgpt等大模型工具,通过编写提示词,辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多,流量分析的需求多种多样,…...
Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合
概述 实时目标检测对于许多实际应用来说已经变得至关重要,而Ultralytics公司开发的YOLO(You Only Look Once,只看一次)系列一直是最先进的模型系列,在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...
一个行为类似标准库find算法的模板
函数需要两个模板类型参数,一个表示函数的迭代器参数,另一个表示值的类型。 代码 #include<iostream> #include<string> #include<vector> #include<list>using namespace std;template <typename IterType,typename T>…...
LLC谐振变换器恒压恒流双竞争闭环simulink仿真
1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系代为转换)针对全桥LLC拓扑,利用Matlab软件搭建模型,分别对轻载…...
Elasticsearch 的分布式架构原理:通俗易懂版
Elasticsearch 的分布式架构原理:通俗易懂版 Lucene 和 Elasticsearch 的前世今生 Lucene 是一个功能强大的搜索库,提供了高效的全文检索能力。然而,直接基于 Lucene 开发非常复杂,即使是简单的功能也需要编写大量的 Java 代码&…...
[深度学习]基于C++和onnxruntime部署yolov12的onnx模型
基于C和ONNX Runtime部署YOLOv12的ONNX模型,可以遵循以下步骤: 准备环境:首先,确保已经下载后指定版本opencv和onnruntime的C库。 模型转换: 安装好yolov12环境并将YOLOv12模型转换为ONNX格式。这通常涉及使用深度学习…...
seacmsv9报错注入
1、seacms的介绍 seacms中文名:海洋影视管理系统。是一个采用了php5mysql架构的影视网站框架,因此,如果该框架有漏洞,那使用了该框架的各个网站都会有相同问题。 2、源码的分析 漏洞的部分源码如下: <?php …...
剑指 Offer II 033. 变位词组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20033.%20%E5%8F%98%E4%BD%8D%E8%AF%8D%E7%BB%84/README.md 剑指 Offer II 033. 变位词组 题目描述 给定一个字符串数组 strs ,将 变位词 组合在一起…...
【2025全网最新最全】前端Vue3框架的搭建及工程目录详解
文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址:https://nodejs.org/zh-cn/ 安装完成后,打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…...
前缀和专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》
目录 一、0求和 - 蓝桥云课 算法代码: 代码思路概述 代码详细解释 数组定义 输入读取 前缀和计算部分 结果计算部分 输出结果 程序结束 总结 二、1.可获得的最小取值 - 蓝桥云课 算法代码: 代码思路概述 详细代码逻辑解释 输入初始化 …...
1.测试策略与计划设计指南
1.介绍 1.1项目介绍 完整项目组成:1.基于K8S定制开发的SaaS平台;2.多个团队提供的中台服务(微服务);3.多个业务团队开发的系统平台。涉及多个项目团队、上百个微服务组件。 测试在所有团队开发测试后,自己搭建测试环境,…...
pikachu
暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程(非常详细)零基础入门到精通,看一篇就够了!让你挖洞事半功倍!_burpsuite使用教程-CSDN博客 登录页面,随意输入抓包,发送到攻击…...
HDFS扩缩容及数据迁移
1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理,决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...
设计模式-(状态模式,策略模式,代理模式,责任链模式)
状态模式 概念: 用于管理一个对象在不同状态下的行为变化。它允许对象在内部状态改变时改变其行为,从而让对象看起来像是改变了其类。状态模式的核心思想是将状态封装到独立的类中,每个状态类都定义了在该状态下对象的行为 状态模式主要涉…...
二、IDE集成DeepSeek保姆级教学(使用篇)
各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…...
通义灵码插件安装入门教学 - IDEA(安装篇)
在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…...
每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理
引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…...
qt-C++笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试
qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试 code review! 文章目录 qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试1.Application(Qt):Qt Widgets Application1.1.qmake版本1.2.cmake版本 2.Application(Qt):Qt Console Applicati…...
【NestJS系列】安装官方nestjs CLI 工具
环境搭建指南:从零开始创建 NestJS 项目 一、工具准备 1. 安装 Node.js 环境 推荐使用 LTS 版本(目前 20.x 以上)验证安装:终端执行 node -v 和 npm -vNode.js 官网下载2. 包管理器选择 这里选用更高效的 pnpm,你也可选择 npm 或 yarn # 安装 pnpm npm install -g pnp…...
【Springboot知识】Logback从1.2.x升级到1.3.x需要注意哪些点?
文章目录 **1. 确认依赖版本**示例依赖配置(Maven): **2. 处理 StaticLoggerBinder 的移除**解决方案: **3. 修改日志配置文件**示例 logback.xml 配置: **4. 检查兼容性问题**Spring Boot 2.x 的兼容性解决方案&#…...
【Linux C | 时间】localtime 的介绍、死机、死锁问题以及 localtime_r 函数的时区问题
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
每日一题——LRU缓存机制的C语言实现详解
LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...
虚函数表和虚函数表指针
1.虚函数表什么时候生成? 编译器编译的时候生成 2.虚函数表存放在哪里? 讨论两种情况:在磁盘(可执行程序)、在内存(运行状态) 3.虚函数表与虚函数表指针的关系 每个类只有一个虚函数&#x…...
计算机毕业设计SpringBoot+Vue.js图书进销存管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具,就好像是一个大管家,帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…...
【学写LibreCAD】1 LibreCAD主程序
一、源码 头文件: #ifndef MAIN_H #define MAIN_H#include<QStringList>#define STR(x) #x #define XSTR(x) STR(x)/*** brief handleArgs* param argc cli argument counter from main()* param argv cli arguments from main()* param argClean a list…...
CentOS7最小化安装中使用curl安装yum和wget
在 CentOS 7 最小化安装中,如果已经有curl工具,可以按照以下步骤使用它来安装yum和wget: 1. 备份原有的 yum 源配置文件 为了避免配置冲突或后续需要恢复,先备份原有的yum源配置文件。 mv /etc/yum.repos.d/CentOS-Base.repo /…...
【Linux】learning notes(3)make、copy、move、remove
文章目录 1、mkdir (make directory)2、rmdir (remove directory)3、rm(remove)4、>5、touch 新建文件6、mv(move)7、cp(copy) 1、mkdir (make…...
P10108 [GESP202312 六级] 闯关游戏
题目大意 如题 分析 设最佳通关方案为 { s 1 , s 2 , . . . , s k } \{s_1,s_2,...,s_k\} {s1,s2,...,sk},其中 s i s_i si 代表第 i i i 次到达的关卡( ≥ N \ge N ≥N 的不算)。 当 a k N − 1 a_kN-1 akN−1 时&#…...
Dubbo RPC 原理
一、Dubbo 简介 Apache Dubbo 是一款高性能、轻量级的开源 RPC 框架,支持服务治理、协议扩展、负载均衡、容错机制等核心功能,广泛应用于微服务架构。其核心目标是解决分布式服务之间的高效通信与服务治理问题。 二、Dubbo 架构设计 1. 核心组件 Prov…...
网络安全 机器学习算法 计算机网络安全机制
(一)网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型: 自主访问控制强制访问控制 访问控制措施: 入…...
【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
确定执行机器和自定义工作目录(忽略节点的workspace) pipeline{agent {node {label "XXXXX"customWorkspace "E:/workspace/"}}parameters {}options {}stages {}post {} }仅确定执行机器 pipeline{agent { label "XXXXX&quo…...
Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
【万字长文】开源之播对话白鲸开源CEO郭炜--乐观主义的开源精神走得更远
本文为白鲸开源科技CEO郭炜1小时深度访谈全记录 来源于:开源之播」Episode15:对话郭炜–乐观主义的开源精神走得更远 大家好,我是郭炜,开源圈的“郭大侠”。作为 Apache 基金会的成员,我曾参与并孵化了多个开源项目,如…...
Verilog 位运算符和逻辑运算符的使用
Verilog 位运算符和逻辑运算符的使用 目录 前言 一、逻辑运算符 二、位运算符 总结 前言 本文详细描述了Verilog 逻辑运算符和位运算符的使用,随着编程的熟练,有时候总是喜欢混用它们,虽然能实现同样的功能,但最好还是注意一下…...