william.chan's blog

done is better than perfect

nestjs passport-github2 实现Github第三方登录

在现代 Web 网站中,提供第三方 OAuth 登录(如 GitHub、Google、微信)可以极大降低用户注册的门槛。本篇文章将带你在 NestJS 中,利用 passport-github2 策略,实现标准的 GitHub OAuth2.0 授权登录流程。 准备工作:申请 GitHub OAuth App 在开始写代码之前,你需要去 GitHub 申请一个 OAuth Applica...

nestjs jwt access_token & refresh_token

双 token 实现登录鉴权

在现代 Web 应用的鉴权体系中,基于 JWT(JSON Web Token)的双 Token 机制(access_token 提供端点访问权限,refresh_token 负责无感刷新)是最常用的业界标准方案之一。 本文将带你在 NestJS 中,从 DTO 设计到双策略校验,一步步实现这套安全、可靠的双 Token 登录鉴权方案。 为什么需要双 Token? Access T...

nestjs 基于 RBAC 实现权限控制

RBAC(Role Based Access Control)基于角色的权限控制

RBAC(Role-Based Access Control,基于角色的访问控制)是业界最广泛使用的权限管理模型。本文将带你在 NestJS 中,从 DTO 设计到装饰器、守卫(Guard)的开发,一步步实现标准的 RBAC 权限控制。 RBAC 核心概念 在标准 RBAC 模型中,权限与角色相关联,用户通过成为适当角色的成员而得到对应的权限。其核心关系如下: User(用户):...

nestjs 基于ACL实现权限控制

ACL(Access Control List)访问控制列表

在后台管理系统中,权限控制是必不可少的一环。常见的权限模型有 RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)以及 ACL(访问控制列表)。 本文将带你一步步使用 NestJS 的核心特性(装饰器 Decorator 和 守卫 Guard)来实现一个基础的 ACL 权限控制系统。 1. 明确实现思路 在 NestJS 中,实现权限控制的推荐做法是: 认证(Auth...

nestjs 保存登录状态 JWT

原理解释,问题和解决方案

在前后端分离和微服务架构盛行的当下,JWT(JSON Web Token)成为了最流行的跨域认证解决方案。相较于传统的 Session + Cookie,JWT 带来了一种无状态的登录保持方案。 JWT 原理简介 与传统 Session 在服务端内存或 Redis 中保存用户状态不同,JWT 把用户基本状态信息(如用户 ID、角色、过期时间等)直接保存在客户端。 一个 JWT 字符串由...

nestjs 保存登录状态 session + cookie

原理解释,问题和解决方案

原理简介 HTTP 协议是无状态的,这意味着每次客户端发起的请求,服务端都不知道这个客户端以前发过什么请求。为了能够在多个请求之间保持用户的状态(如登录状态),我们最常用的方案之一就是 Session + Cookie。 Cookie:存在于客户端(浏览器),每次发送请求时会自动携带对应域名下的 Cookie 传递给服务端。 Session:存在于服务端。服务端生成一个唯一的标...

nestjs 快速掌握 Redis

在本文中,我们将探讨如何在 NestJS 项目中快速集成和使用 Redis。无论是作为缓存、消息代理(Pub/Sub)还是实现分布式锁,Redis 都是现代微服务架构中不可或缺的利器。 为什么在 NestJS 中使用 Redis? 高性能缓存:大幅减少数据库查询负担,提高响应速度。 状态共享:在分布式系统或集群部署中共享 Session、Token 等状态。 消息队列 / ...

nestjs 快速掌握 TypeORM

深入图解 TypeORM 核心架构:DataSource、EntityManager 与 Repository

在 NestJS 开发中,TypeORM 是最常被使用的 ORM(对象关系映射)框架。学习 TypeORM 最初的门槛,往往是理不清它里面那几个长得很像的核心类。 本文将结合开局的架构思想图关系,为你彻底梳理清楚 DataSource、EntityManager、Repository 以及 Entity 之间的运作流转逻辑。 1. 核心架构层级解析 在开始讲解每个对象之前,我们先通...

nestjs mysql transaction 和 savepoint

彻底搞懂 ACID、事务并发控制与局部回滚(Savepoint)

在真实的后端业务开发中,我们常常会遇到诸如“转账”这样的场景:A 账户扣钱,B 账户加钱。如果 A 扣钱成功了,但在执行 B 加钱的那一瞬间服务器断电了,或者抛了一个异常,那这笔钱不就凭空消失了吗? 为了解决这种“多步操作必须同生共死”的问题,我们需要引入关系型数据库的超级重器——事务(Transaction)。而 Savepoint(保存点) 则是事务中非常实用的高级进阶特性。 1. ...

nestjs sql select子查询和exists

突破单表查询瓶颈:深入理解 SQL 子查询与 EXISTS 优化

在复杂的业务场景中,我们常常需要基于一个查询的结果去执行另一个查询,这就是子查询(Subquery)。子查询可以让哪怕最复杂的逻辑论证都能在一条 SQL 语句中完成。而 EXISTS 关键字作为子查询的绝佳伴侣,在处理海量数据的性能优化时更是不可或缺。 本文将结合 SQL 原生语句与 NestJS (TypeORM) 实战,带你彻底搞懂并用好它们。 1. 什么是子查询? 子查询是指嵌套...