内功篇Paid
6、数据安全 RLS
上一课我们成功地为网站装上了“前门”,用户现在可以通过 Google 账号安全地登录了。这是一个巨大的进步!
但是,正如我们结尾时提到的,我们还面临两个关键问题:
1、我们没有地方存储用户的自定义信息,比如他们的昵称、个人简介等。
2、我们的数据库就像一个空旷的大厅,没有任何安全隔离。
这一课,我们将一举解决这两个问题,学习如何为每个用户创建他们专属的、安全的“个人档案室”。这就要用到 Supabase 的核心安全功能——行级安全策略 (Row-Level Security, RLS)。
在开始操作前,你必须先理解 Supabase 安全模型的两个基本概念。
核心一:两把关键的“钥匙” (API Keys)
在你的 Supabase 项目后台“API 设置”里,你会看到很多密钥,但其中最重要的有两个,你必须清楚它们的区别:
| 钥匙类型 | 中文名 | 在哪里用? | 权限如何? |
|---|---|---|---|
anon public | 前端访客钥匙 | 用在你的前端代码里 (比如 React, Vue 应用中)。 | 低权限。它是一个“匿名”钥匙,它能做什么完全取决于下面要讲的 RLS 策略。 |
service_role | 后端超管钥匙 | 只能用在安全的后端环境 (比如 Vercel Edge Functions, Next.js 服务器)。 | 最高权限 (上帝模式)。它可以无视所有 RLS 策略,对数据库进行任何操作。 |
安全红线警告:
anon public 钥匙是可以也应该暴露在你网站的前端代码里的,这很安全,前提是你启用了 RLS。
service_role 钥匙是你的最高机密!绝对、绝对、绝对不能把它写在前端代码里,或者上传到公开的 GitHub 仓库。泄露它等于把你的整个数据库拱手让人。

核心二:为用户创建“个人档案室” (Profiles 表)
auth.users 表只应该存放认证的核心数据。如果你想存储用户的昵称、个人简介、会员等级等应用特有的数据,最佳实践是:
1、回到我们熟悉的 Table Editor,点击 “Create a new table”,创建一个名为 profiles 的新表。
2、定义列:
`**id**`:这一列非常关键。Name 填 `id`,Type 选择 `uuid`。然后,点击它右侧的“小齿轮”图标进行高级设置,把它设置为 **Foreign Key (外键)**,关联到 `auth` schema 下的 `users` 表的 `id` 字段。
**这步操作的意义是**:将我们新的 `profiles` 表与 Supabase 自带的 `users` 表通过用户的唯一 ID 关联了起来,建立了一一对应的关系。
`**username**`:Type 选择 `text`,用来存放用户的昵称。
`**website**`:Type 选择 `text`,用来存放用户的个人网址。
3、点击 **Save** 保存。
对应的 SQL
```plsql
create table public.profiles (
id uuid primary key references auth.users(id) on delete cascade,
username text,
website text
);
```
## 核心三:部署“保安”——开启