鉴权简介
AdonisJS 带有一个成熟的身份验证系统,可以使用 sessions、basic auth 或 API tokens 对应用程序的用户进行身份验证。
@adonisjs/auth
包添加了对身份验证的支持,它必须单独安装。
注:
auth 包依赖于@adonisjs/lucid
包。确保首先 configure lucid。
// title: Install
npm i @adonisjs/auth
// title: Configure
node ace configure @adonisjs/auth
# CREATE: app/Models/User.ts
# CREATE: database/migrations/1619578304190_users.ts
# CREATE: contracts/auth.ts
# CREATE: config/auth.ts
# CREATE: app/Middleware/Auth.ts file already exists
# CREATE: app/Middleware/SilentAuth.ts file already exists
# UPDATE: .adonisrc.json { providers += "@adonisjs/auth" }
# CREATE: ace-manifest.json file
- 用于身份验证的多个警卫。 会话、API 令牌和基本身份验证
- 可扩展的 API 添加自定义警卫和用户提供程序
配置
auth 包的配置存储在config/auth.ts
文件中。在这个文件中,你可以定义一个或多个保护来验证用户。警卫是用户提供者和可用身份验证驱动程序之一的组合。
import { AuthConfig } from '@ioc:Adonis/Addons/Auth'
const authConfig: AuthConfig = {
guard: 'web',
guards: {
web: {
driver: 'session',
provider: {
driver: 'lucid',
identifierKey: 'id',
uids: ['email'],
model: () => import('App/Models/User'),
},
},
},
}
export default authConfig
警卫
顶级guard
属性定义了用于身份验证的默认保护。它必须在guards
列表中定义。
guards
guards
对象是你要在应用程序中使用的 guards 的键值对, 可以使用相同或不同的驱动程序创建多个 guards。
guards.driver
用于登录和验证用户的驱动程序。你可以使用预先存在的驱动程序之一或扩展 Auth 模块以添加你自己的驱动程序。
session
驱动程序使用 sessions/cookies 来登录和验证请求。oat
代表不透明的访问令牌,并使用无状态令牌来验证请求。basic
使用基本身份验证来验证请求。
guards.provider
provider
属性配置用户提供程序以查找用户。你可以使用预先存在的提供程序之一或扩展 Auth 模块以添加自己的。
以下是可供用户查找的可用驱动程序列表。其余配置值取决于所选驱动程序。
lucid
使用数据模型来查找用户。database
直接查询数据库以查找用户。
配置新的 guards/providers
你还可以在初始设置后配置新的 guards 和辅助程序。第一步是将它们注册到 contracts/auth.ts
文件中,以通知 TypeScript 静态编译器。
你可以在 ProvidersList
接口中添加新的提供程序。键是辅助器的名称,以及配置和实现的类型。
GuardsList
接口是你要使用的所有 guards 的列表。键是 guards 的名称,以及 guards 配置及其实现的类型。
// 文件名: contracts/auth.ts
declare module '@ioc:Adonis/Addons/Auth' {
interface ProvidersList {
user: {
implementation: LucidProviderContract<typeof User>,
config: LucidProviderConfig<typeof User>,
},
apps: {
implementation: LucidProviderContract<typeof App>,
config: LucidProviderConfig<typeof App>,
}
}
interface GuardsList {
web: {
implementation: SessionGuardContract<'user', 'web'>,
config: SessionGuardConfig<'user'>,
},
api: {
implementation: OATGuardContract<'apps', 'api'>,
config: OATGuardConfig<'apps'>,
}
}
}
一旦你在合约文件中添加了新的 guards 或辅助器,TypeScript 编译器将自动验证配置文件,强制你也为它定义配置。
迁移
设置过程还为 users
表和可选的 tokens
表创建迁移文件(如果使用带有 SQL 存储的 API 令牌保护)。
迁移的文件名使用当前时间戳,并放置在所有现有迁移之后。
你的某些表可能需要使用 users
表创建外键约束,因此 users
表迁移必须在这些迁移之前运行。
在这种情况下,可以手动重命名 users
表迁移文件,并使用较小的时间戳将其移动到其他迁移文件之前。
用法
你可以使用 ctx.auth
属性访问路由处理程序中的 auth
实例。auth 对象允许你登录用户和验证后续请求。
// 主题:登录用户
Route.post('login', async ({ auth, request }) => {
const email = request.input('email')
const password = request.input('password')
await auth.use('web').attempt(email, password)
})
// 主题: 验证后续请求
Route.get('dashboard', async ({ auth }) => {
await auth.use('web').authenticate()
// ✅ 请求认证
console.log(auth.user!)
})
除了基本用法之外,我们建议你阅读各个 guards 的指南,因为它们的 API 和流程可能会有所不同。
模板内引用
ctx.auth
属性也与模板共享。你可以使用它有条件地显示标记的特定部分。
@if(auth.isLoggedIn)
<p> Hello {{ auth.user.username }} </p>
@endif
辅助器配置参考
以下是用户辅助器配置和合同的参考。
Lucid 辅助器
lucid
辅助器使用数据模型从数据库中查找用户。必须首先在合同文件中配置辅助器。
import User from 'App/Models/User'
interface ProvidersList {
providerName: {
implementation: LucidProviderContract<typeof User>,
config: LucidProviderConfig<typeof User>,
}
}
以下是所有可用配置选项的列表。
{
provider: {
driver: 'lucid',
identifierKey: 'id',
uids: ['email'],
model: () => import('App/Models/user'),
connection: 'pg',
hashDriver: 'argon',
}
}
driver
驱动程序名称必须始终设置为 lucid
。
identifierKey
identifierKey
通 常是配置模型上的主键。身份验证包需要它来唯一标识用户。
uids
用于用户查找的模型列数组。auth.login
方法使用 uids
查找用户。
例如:如果你的应用程序允许同时使用电子邮件和用户名登录,那么必须将它们定义为 uids
。此外,你需要定义模型列名而不是数据库列名。
model
用于用户查找的模型。它必须使用闭包延迟导入。
{
model: () => import('App/Models/user'),
}
connection
用于进行 SQL 查询的数据库连接。如果未定义,将使用模型连接。
hashDriver
用于验证用户密码哈希的驱动程序。它由 auth.login
方法使用。如果未定义,我们将使用 config/hash.ts
文件中的默认哈希驱动程序。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。