对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

用户身份认证

在本指南中,您可以学习;了解如何使用 Laravel 的原生身份验证功能对MongoDB用户进行身份验证。

Laravel 提供原生Auth 模块,其中包括身份验证服务,例如定义如何对用户进行身份验证的防护程序以及定义如何检索用户的提供程序。要学习;了解有关这些服务的更多信息,请参阅 身份验证 Laravel 文档中的身份验证。

默认,Laravel 会在App/Models目录中生成User Eloquent 模型。 要为MongoDB用户启用身份验证,您的User模型必须扩展MongoDB\Laravel\Auth\User类。

要扩展此类,请导航到app/Models/User.php文件并将use Illuminate\Foundation\Auth\User as Authenticatable声明替换为以下代码:

use MongoDB\Laravel\Auth\User as Authenticatable;

接下来,确保您的User类扩展了Authenticatable ,如以下代码所示:

class User extends Authenticatable{...}

配置User模型后,创建相应的控制器。 要学习;了解如何创建控制器,请参阅本页的创建用户控制器部分。

以下代码显示了扩展MongoDB\Laravel\Auth\User类的User.php文件:

<?php namespace App\Models; use MongoDB\Laravel\Auth\User as Authenticatable; class User extends Authenticatable{ protected $connection = 'mongodb'; protected $table = 'users'; protected $fillable = [ 'name', 'email', 'password', ]; protected $hidden = [ 'password', 'remember_token', ];}

要存储管理身份验证的函数,请为您的User模型创建一个身份验证控制器。

从项目根目录运行以下命令以创建控制器:

php artisan make:controller <filename>

以下命令创建一个名为AuthController.php的控制器文件:

php artisan make:controller AuthController

AuthController.php文件可以存储login()和logout()函数来管理用户身份验证,如以下代码所示:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request;use Illuminate\Support\Facades\Auth;use Illuminate\Validation\ValidationException; use function response; class AuthController extends Controller{ public function login(Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (Auth::attempt($request->only('email', 'password'))) { return response()->json([ 'user' => Auth::user(), 'message' => 'Successfully logged in', ]); } throw ValidationException::withMessages([ 'email' => ['The provided credentials are incorrect.'], ]); } public function logout() { Auth::logout(); return response()->json(['message' => 'Successfully logged out']); }}

您可以自定义身份验证文件,以满足应用程序的需求,并启用其他身份验证功能。

本节介绍如何使用以下功能自定义MongoDB用户身份验证进程:

Laravel Sanctum 是一个身份验证包,可以管理API请求和单页面应用程序身份验证。 为了管理API请求,Sanctum 会颁发存储在数据库中的API令牌,并使用Authorization标头对传入的HTTP请求进行身份验证。 为了对单页面应用程序进行身份验证,Sanctum 使用 Laravel 基于 cookie 的身份验证服务。

您可以安装 Laravel Sanctum 来管理应用程序的身份验证进程。 从项目根目录运行以下命令来安装 Laravel Sanctum 并发布其迁移文件:

composer require laravel/sanctumphp artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

要将 Laravel Sanctum 与 Laravel 集成一起使用,请修改 Sanctum 提供的PersonalAccessToken模型以使用MongoDB\Laravel\Eloquent命名空间中的DocumentModel特征。 以下代码会修改PersonalAccessToken模型以启用MongoDB:

<?php namespace App\Models; use Laravel\Sanctum\PersonalAccessToken as SanctumToken;use MongoDB\Laravel\Eloquent\DocumentModel; class PersonalAccessToken extends SanctumToken{ use DocumentModel; protected $connection = 'mongodb'; protected $table = 'personal_access_tokens'; protected $keyType = 'string';}

接下来,运行以下命令修改数据库模式:

php artisan migrate

现在,您可以通过调用应用程序的服务提供程序之一中的 usePersonalAccessTokenModel() 方法来指示 Sanctum 使用自定义 PersonalAccessToken 模型。要学习;了解更多信息,请参阅 Laravel Sanctum指南中的覆盖默认模型。

提示

要学习;了解有关DocumentModel特征的更多信息,请参阅 Eloquent 模型类指南中的扩展第三方模型类。

Laravel Passport 是一种 OAuth 2.0服务器实施,可为 Laravel 应用程序提供API身份验证。 如果您的应用程序需要 OAuth 2支持,请使用 Laravel Passport。

提示

要学习;了解有关 Laravel Passport 和 OAuth 2.0协议的更多信息,请参阅以下资源:

要安装 Laravel Passport 并运行存储OAuth 2客户端所需的数据库迁移,请从项目根目录运行以下命令:

php artisan install:api --passport

接下来,导航到User模型并添加Laravel\Passport\HasApiTokens特征。 此特征提供了辅助方法,允许您检查用户的身份验证令牌和范围。 以下代码展示了如何将Laravel\Passport\HasApiTokens添加到app\Models\User.php文件:

<?php namespace App\Models; use MongoDB\Laravel\Auth\User as Authenticatable;use Laravel\Passport\HasApiTokens; class User extends Authenticatable{ use HasApiTokens; ...}

然后,在config\auth.php文件中定义api身份验证防护,设立driver选项设置为passport 。 这会指示您的应用程序使用 Laravel Passport 的TokenGuard类来对API请求进行身份验证。 以下示例将api身份验证防护添加到guards大量:

'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ],],

安装 Laravel Passport 后,必须通过定义扩展相应 Passport 模型的自定义 Laravel 集成模型来启用Passport 与MongoDB的兼容性。 要扩展每个 Passport 模型类,请在自定义模型中包含DocumentModel特征。 您可以定义以下 Laravel 集成模型类:

  • MongoDB\Laravel\Passport\AuthCode,它扩展了 Laravel\Passport\AuthCode

  • MongoDB\Laravel\Passport\Client,它扩展了 Laravel\Passport\Client

  • MongoDB\Laravel\Passport\PersonalAccessClient,它扩展了 Laravel\Passport\PersonalAccessClient

  • MongoDB\Laravel\Passport\RefreshToken,它扩展了 Laravel\Passport\RefreshToken

  • MongoDB\Laravel\Passport\Token,它扩展了 Laravel\Passport\Token

以下示例代码在定义MongoDB\Laravel\Passport\AuthCode类时扩展了默认的Laravel\Passport\AuthCode模型类并包含DocumentModel特征:

class MongoDB\Laravel\Passport\AuthCode extends Laravel\Passport\AuthCode{ use MongoDB\Laravel\Eloquent\DocumentModel; protected $primaryKey = '_id'; protected $keyType = 'string';}

定义扩展每个Laravel\Passport类的自定义模型后,指示 Passport 使用应用程序的App\Providers\AppServiceProvider类的boot()方法中的模型。 以下示例将每个自定义模型添加到boot()方法:

<?php namespace App\Providers; use Illuminate\Support\ServiceProvider;use MongoDB\Laravel\Passport\AuthCode;use MongoDB\Laravel\Passport\Client;use MongoDB\Laravel\Passport\PersonalAccessClient;use MongoDB\Laravel\Passport\RefreshToken;use MongoDB\Laravel\Passport\Token; class AppServiceProvider extends ServiceProvider{ /** * Register any application services. */ public function register(): void { } /** * Bootstrap any application services. */ public function boot(): void { Passport::useAuthCodeModel(AuthCode::class); Passport::useClientModel(Client::class); Passport::usePersonalAccessClientModel(PersonalAccessClient::class); Passport::useRefreshTokenModel(RefreshToken::class); Passport::useTokenModel(Token::class); }}

然后,您可以在应用程序中使用 Laravel Passport 和MongoDB 。

要添加支持基于MongoDB的密码提醒的支持,请在应用程序中注册以下服务提供商:

MongoDB\Laravel\Auth\PasswordResetServiceProvider::class

此服务提供商修改内部DatabaseReminderRepository以启用密码提醒。

以下代码更新 Laravel应用程序bootstrap目录中的providers.php文件以注册PasswordResetServiceProvider提供商:

return [ App\Providers\AppServiceProvider::class, MongoDB\Laravel\MongoDBServiceProvider::class, MongoDB\Laravel\Auth\PasswordResetServiceProvider::class];

要学习;了解有关用户身份验证的更多信息,请参阅 身份验证 Laravel 文档中的身份验证。

要学习;了解有关 Eloquent 模型的更多信息,请参阅Eloquent 模型类指南。