文档菜单
文档首页
/ / /
Laravel MongoDB

用户认证

本页内容

  • 概述
  • 修改用户模型
  • 示例
  • 创建用户控制器
  • 示例
  • 自定义用户认证
  • Laravel Sanctum
  • Laravel Passport
  • 密码提醒
  • 附加信息

在这篇指南中,您可以学习如何使用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安装到您的项目中,并发布其迁移文件来管理应用程序的身份验证过程。

composer require laravel/sanctum
php 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认证。如果您的应用程序需要OAuth2支持,请使用Laravel Passport。

提示

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

要安装Laravel Passport并运行必要的数据库迁移以存储OAuth2客户端,请在项目根目录下运行以下命令

php artisan install:api --passport

接下来,导航到您的 User 模型并添加 Laravel\Passport\HasApiTokens trait。此trait提供辅助方法,允许您检查用户的认证令牌和范围。以下代码演示了如何将 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 类的自定义模型后,在您的应用程序的 App\Providers\AppServiceProvider 类的 boot() 方法中指导 Passport 使用这些模型。以下示例将每个自定义模型添加到 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模型类指南。

返回

查询构建器