casdoor 使用实践
核心概念
OAuth2.0
OAuth2.0是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要分享他们的凭证。
Organization
Application
User
Provider
Application登录url如何在前端和后端代码中获取其他应用程序的URLs呢? 您可以手动连接字符串,或者调用Casdoor SDKs提供的一些实用函数来获取URL。
手动连接字符串
前端SDK
后端SDK
ProviderCasdoor是一个联合的单点登录系统,支持通过OIDC、OAuth和SAML的多个身份提供商。 Casdoor也可以通过电子邮件或短信向用户发送验证码或其他通知。 Casdoor 使用 Provider 的概念来管理所有这些第三方连接器。
Casdoor是如何自我管理的?首次运行Casdoor时,会创建一些内置对象以方便其管理:
一个内置的命名为 built-in 的组织。
built-in 组织下用户名为 admin的用户 。
一个名为app-built-in的内置应用,由built-in组织管理,代表Casdoor本身。 ...
电子书平台数据库表设计
E-R 图如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051erDiagram BOOK { int id PK string title string author string description int status float rating date addedDate } CATEGORY { int id PK string name } BOOKCATEGORY { int bookId FK int categoryId FK } USER { int id PK string username s ...
Modernlibre API document
FORMAT: 1AHOST: https://api.modernlibre.com
ModernLibre APIData StructuresBaseResponse (object)
code: 200 (number) - 响应码
message: 成功 (string) - 响应消息
data: (object, optional) - 响应数据
SseEmitter (object)
id: abc123 (string) - SSE 连接的客户端 ID
status: connected (string) - SSE 连接状态
file (string)
description: file
format: binary
Book (object)
id: 123 (number) - 书本 ID
title: 书本标题 (string) - 书本标题
author: 作者 (string) - 作者
description: 书本描述 (string) - 书本描述
status: 0 (number) - 书本状态
rating: 4.5 (number) - ...
【DragonOS】命令行工具开发任务书
【任务书】用 rust 写个能在 DragonOS 上跑的简易命令行程序
【DragonOS】编译相关
PR #954 build: Remove DragonOS_GCCx86_64-elf-gcc 是一个交叉编译器,它是 GNU 编译器集合(GNU Compiler Collection,GCC)的一部分,用于为 x86_64-elf 目标平台编译代码。交叉编译器能够在一个平台上编译出另一个平台的可执行代码。在这种情况下,x86_64-elf-gcc 允许开发者在比如 x86-64 架构的机器上编译出能够在 ELF(Executable and Linkable Format)格式下运行的 x86_64 架构的代码,通常用于嵌入式系统开发或其他需要特定目标平台的场景。
x86_64-elf-gcc 通常用于操作系统开发,特别是当你需要为一个不同于宿主机的操作系统或硬件平台编译代码时。例如,如果你正在开发一个需要在 ARM 架构上运行的操作系统,但你的宿主机器是 x86_64 架构的,那么你可以使用 x86_64-elf-gcc 来编译你的操作系统内核和用户空间应用程序,生成 ARM 架构能够理解的二进制文件。
此外,x86_64-elf-gcc 可以安装在类 Unix 系统上,如 L ...
【Docs】Uevent 与 Netlink 的设计与实现
feat(Netlink & Uevent): add Uevent with Netlink已实现的功能
用户态 POSIX API Netlink 套接字,支持创建、绑定 Netlink 套接字,发送、接收 Netlink 消息
内核支持 Netlink 组播消息,发送到用户进程中订阅了该组播组的 Netlink 套接字
内核支持准备、发送 uevent 到用户态
支持 sysfs下的 uevent 文件读写,用户态写入 uevent 文件后,内核会发送 uevent 消息到用户态与 Linux 实现不同的
sk_buff 的实现,简化设计
NL_TABLE 的哈希链实现,不用 Linux 内部的 rhashtable,用 hashmap 替代目前没有实现的功能
内核接受并处理用户态发送的 netlink 消息(由于 uevent 通常不是用户主动发给内核的,而是由内核主动生成并发送给用户态的,故该流程暂未实现)
udev 守护进程,用于监听 uevent 事件,实现设备的自动配置
net namespace,用于隔离网络设备
rcu,Read-Copy-Update,一 ...
服务器持续集成部署中遇到的各种问题
静态编译解决Ubuntu18.04下node20.17.0的Glibc版本问题起因是我想要为俱乐部的官网项目仓库构建CI/CD工作流,以便于在每次有新的提交时自动执行构建检查并部署到服务器上,但是在实际操作中遇到了各种各样的问题,这里记录一下。
首先是,GitHub Actions 现在要求工作流的node环境版本会强制跑在 node20 版本之上,本来这样没有什么问题,用nvm一套安装就行了,但是问题就在于我们服务器的 Ubuntu 系统版本是18.04,如果直接 use 20.17.0的话,动态库Glibc版本不匹配,因为18.04的Glibc版本是2.27,而20.17.0的Glibc版本要求是2.28,所以这个问题就很尴尬了。众所周知,Glibc是一个系统级别的库,大部分的Linux发行版直接升级 Glibc 都会导致系统不稳定,而另一方面,服务器刚刚重装过系统,如果硬要升级系统到20.04,又要考虑机器的性能,时间成本等问题,所以只能从 node 入手。
而一般来说,安装node有四种方式:
最简单粗暴的就是通过包管理器直接安装:1sudo apt install node ...
【DragonOS】chown系统调用
需要注意的地方UserBufferReader需要使用UserbufferReader对来自用户态的指针进行校验,然后通过UserBufferReader进行读操作,否则不安全。
在验证地址安全性之前,不允许访问用户内存。应该是userbuffer的功能你还没理解。如果不校验的话,要是用户传一个内核地址进来,那就会造成系统崩溃之类的问题了。
userbuffer的操作应该在filesystem/vfs下进行。
chown、lchown 和 fchown 是 Linux 系统中用于更改文件或目录所有权的命令。
chown (change owner): 这个命令用于更改指定文件或目录的用户所有权(所有者)和/或组所有权(组)。用户可以是用户名或者用户 ID,组可以是组名或者组 ID。如果不指定组,则只更改所有者。命令的基本语法如下:
1chown [OPTION]... [OWNER][:[GROUP]] FILE...
其中,OWNER 是新的文件所有者,GROUP 是新的文件组,而 FILE... 是一个或多个文件或目录的列表。chown 命令可以递归地更改目录及其内容的所有者(使 ...
C++八股文
C++八股文C++智能指针C++标准库中的几种常见智能指针类型包括:
std::unique_ptr: 独占所有权,一个对象只能被一个unique_ptr所管理,不能被拷贝,只能通过移动语义转移所有权。
std::shared_ptr: 共享所有权,多个shared_ptr可以同时管理同一个对象,当最后一个引用销毁时,内存才被释放。
std::weak_ptr: 辅助shared_ptr,不会增加引用计数,避免循环引用(内存泄漏问题),通常用于打破 shared_ptr 之间的环状依赖。
这些智能指针的核心作用是自动管理动态分配的内存,使得程序员不必手动释放内存,避免内存泄漏等问题。
Rust中的引用类型简介Rust中没有智能指针的概念,但它有一套独特的所有权机制和引用类型来管理内存。常见的引用类型包括:
引用(& 和 &mut): 借用机制,用于临时访问数据而不转移所有权。&代表不可变引用,&mut代表可变引用。
Box: 类似于C++的unique_ptr,表示堆上分配的单一所有权。只有拥有Box的地方能销毁这个堆内存。
Rc: 类似于C++的s ...