用户认证
概述
在这篇指南中,您可以学习如何使用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
文件
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()
函数来管理用户认证,如下代码所示
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
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。
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
Laravel Passport是一个OAuth 2.0服务器实现,为Laravel应用程序提供API认证。如果您的应用程序需要OAuth2支持,请使用Laravel Passport。
提示
要了解有关Laravel Passport和OAuth 2.0协议的更多信息,请参阅以下资源
Laravel Passport 在Laravel文档中。
OAuth 2.0 在OAuth网站上。
安装Laravel Passport
要安装Laravel Passport并运行必要的数据库迁移以存储OAuth2客户端,请在项目根目录下运行以下命令
php artisan install:api --passport
接下来,导航到您的 User
模型并添加 Laravel\Passport\HasApiTokens
trait。此trait提供辅助方法,允许您检查用户的认证令牌和范围。以下代码演示了如何将 Laravel\Passport\HasApiTokens
添加到您的 app\Models\User.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 与 Laravel MongoDB 结合使用
安装 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()
方法中
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模型类指南。