Authentication(认证)
AdonisJS 提供了一个强大且安全的认证系统,你可以使用它来登录并验证你的应用程序的用户。无论是服务器端渲染的应用程序、SPA 客户端还是移动应用,你都可以为它们设置认证。
认证包是围绕 guards(守卫) 和 providers(提供者) 构建的。
-
Guards 是特定登录类型的端到端实现。例如,
session
守卫允许你使用 cookie 和会话来验证用户身份。同时,access_tokens
守卫将允许你使用令牌来验证客户端。 -
Providers 用于从数据库中查找用户和令牌。你可以使用内置的提供者,也可以实现自己的提供者。
Auth 包不支持的功能
auth 包专注于对 HTTP 请求进行认证,以下功能不在其范围内:
- 用户注册功能,如 注册表单、电子邮件验证 和 帐户激活。
- 帐户管理功能,如 密码恢复 或 电子邮件更新。
- 对于角色的分配或权限的验证,应该在你的应用程序中用 bouncer 来进行授权验证。
选择认证守卫
以下内置认证守卫为你提供了最直接的工作流程,用于在不牺牲应用程序安全性的情况下对用户进行身份验证。另外,您也可以根据自己的需求定制认证守卫。
Session(会话)
会话守卫使用 @adonisjs/session 包来跟踪会话存储中已登录用户的状态。
会话和 cookie 在互联网上已经存在很长时间,并且适用于大多数应用程序。我们建议使用会话守卫:
- 如果你正在创建一个服务器端渲染的 Web 应用程序。
- 也可以是一个 AdonisJS API,其客户端位于同一个顶级域名下。例如,
api.example.com
和example.com
。
Access tokens(访问令牌)
访问令牌是登录成功后颁发给用户的加密安全随机令牌(也称为不透明访问令牌)。你可以在 AdonisJS 服务器无法写入/读取 cookie 的应用程序中使用访问令牌。例如:
- 一个原生移动应用。
- 一个托管在与 AdonisJS API 服务器不同域名的 Web 应用程序。
当使用访问令牌时,客户端应用程序需要确保安全地存储它们。访问令牌代表用户提供对应用程序的无限制访问,若泄露则可能造成安全隐患。
Basic auth(基本认证)
基本认证守卫是 HTTP 身份验证框架 的一种实现,其中客户端必须通过 Authorization
头传递以 base64 编码的字符串形式的用户凭据。
有比基本认证更好的方法来实现安全的登录系统。然而,在应用程序开发活跃期时,你可以暂时使用它。
选择用户提供者
如本指南前面所述,用户提供者在认证过程中负责查找用户。
不同的守卫有各自的用户提供者;例如,会话守卫的用户提供者负责通过用户 ID 查找用户,而访问令牌守卫的用户提供者则负责验证访问令牌。
我们为内置守卫提供了一个 Lucid 用户提供者,它使用 Lucid 模型来查找用户、生成令牌和验证令牌。
安装
认证系统预配置在 web
和 api
启动套件中。然而,你可以按照以下步骤在应用程序中手动安装和配置它。
# 使用会话守卫(默认)进行配置
node ace add @adonisjs/auth --guard=session
# 使用访问令牌守卫进行配置
node ace add @adonisjs/auth --guard=access_tokens
# 使用基本认证守卫进行配置
node ace add @adonisjs/auth --guard=basic_auth
-
使用检测到的包管理器安装
@adonisjs/auth
包。 -
在
adonisrc.ts
文件中注册以下服务提供者。{providers: [// ...其他提供者() => import('@adonisjs/auth/auth_provider')]} -
在
start/kernel.ts
文件中创建并注册以下中间件。router.use([() => import('@adonisjs/auth/initialize_auth_middleware')])router.named({auth: () => import('#middleware/auth_middleware'),// 仅在使用 session 守卫时使用guest: () => import('#middleware/guest_middleware')}) -
在
app/models
目录中创建用户模型。 -
为
users
表创建数据库迁移。 -
为所选守卫创建数据库迁移。
初始化认证中间件
在设置过程中,我们会在你的应用程序中注册 @adonisjs/auth/initialize_auth_middleware
。该中间件负责创建 Authenticator 类的实例,并通过 ctx.auth
属性与请求的其余部分共享它。
请注意,初始化认证中间件不会对请求进行认证或保护路由。它仅用于初始化认证器并与请求的其余部分共享。你必须使用 auth 中间件来保护路由。
此外,如果你的应用程序使用 Edge,则相同的认证器实例会与 Edge 模板共享,你可以使用 auth
属性访问它。例如:
@if(auth.isAuthenticated)
<p> Hello {{ auth.user.email }} </p>
@end
创建 users 表
configure
命令会在 database/migrations
目录中为 users
表创建一个数据库迁移。你可以随意打开此文件并根据应用程序需求进行修改。
默认情况下,会创建以下的字段:
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'users'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id').notNullable()
table.string('full_name').nullable()
table.string('email', 254).notNullable().unique()
table.string('password').notNullable()
table.timestamp('created_at').notNullable()
table.timestamp('updated_at').nullable()
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
此外,如果你在 users
表中定义、重命名或删除列,请更新 User
模型。