Wasp项目教程:为Todo应用添加用户认证系统
2025-07-05 08:29:21作者:裘旻烁
前言
在现代Web应用中,用户认证是不可或缺的核心功能。本文将详细介绍如何在Wasp框架中为Todo应用添加完整的用户认证系统,包括用户注册、登录、权限控制和任务关联等功能。
用户认证基础
Wasp框架内置了强大的认证系统,开发者只需简单配置即可获得完整的认证流程。认证系统包含以下核心组件:
- 用户实体(User Entity)
- 认证方法配置
- 认证相关路由和页面
- 权限控制机制
实现步骤
1. 创建用户实体
Wasp会自动处理认证相关的底层实体,我们只需在Prisma schema中定义用户模型:
model User {
id Int @id @default(autoincrement())
tasks Task[] // 与Task建立一对多关系
}
2. 配置认证方法
在Wasp配置文件中启用用户名密码认证:
app TodoApp {
// ...其他配置
auth: {
userEntity: User,
methods: {
usernameAndPassword: {}
},
onAuthFailedRedirectTo: "/login"
}
}
配置完成后,执行数据库迁移命令更新schema:
wasp db migrate-dev
3. 创建登录和注册页面
Wasp提供了现成的认证表单组件,我们只需创建页面容器:
// 登录页面示例
import { LoginForm } from 'wasp/client/auth'
export const LoginPage = () => {
return (
<div>
<LoginForm />
<span>没有账号?<Link to="/signup">去注册</Link></span>
</div>
)
}
4. 实现页面权限控制
通过简单的配置即可要求用户登录才能访问特定页面:
page MainPage {
authRequired: true, // 开启权限控制
component: import { MainPage } from "@src/MainPage"
}
5. 关联用户和任务
更新Task模型,建立与User的关系:
model Task {
id Int @id @default(autoincrement())
description String
isDone Boolean @default(false)
user User? @relation(fields: [userId], references: [id])
userId Int?
}
6. 实现用户专属操作
修改查询和操作,确保用户只能访问自己的任务:
export const getTasks = async (args, context) => {
if (!context.user) throw new HttpError(401)
return context.entities.Task.findMany({
where: { user: { id: context.user.id } }
})
}
7. 添加退出功能
实现简单的退出按钮:
import { logout } from 'wasp/client/auth'
const LogoutButton = () => (
<button onClick={logout}>退出登录</button>
)
高级特性
Wasp认证系统还支持以下功能:
- 第三方登录(Google、GitHub等)
- 邮箱认证
- 类型安全的链接(TypeScript)
- 自定义认证流程
总结
通过Wasp框架,我们仅用少量代码就实现了完整的用户认证系统,包括:
- 用户注册和登录流程
- 页面级权限控制
- 用户数据隔离
- 安全的退出机制
Wasp的认证系统设计既简单又强大,开发者可以快速集成认证功能,同时保持代码的整洁和可维护性。这种全栈一体化的解决方案显著提高了开发效率,让开发者能更专注于业务逻辑的实现。