用户身份认证
Overview
在本指南中,您可以学习;了解如何使用 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 来管理应用程序的身份验证进程。 从项目根目录运行以下命令来安装 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 $primaryKey = '_id'; protected $keyType = 'string'; }
接下来,运行以下命令修改数据库模式:
php artisan migrate
现在,您可以通过调用应用程序的服务提供程序之一中的usePersonalAccessTokenModel()
方法来指示 Sanctum 使用自定义PersonalAccessToken
模型。 要学习;了解更多信息,请参阅 覆盖默认模型 在 Laravel Sanctum指南中。
提示
要学习;了解有关DocumentModel
特征的更多信息,请参阅 Eloquent 模型类指南中的扩展第三方模型类。
Laravel Passport
Laravel Passport 是一种 OAuth 2.0服务器实施,可为 Laravel 应用程序提供API身份验证。 如果您的应用程序需要 OAuth 2支持,请使用 Laravel Passport。
提示
要学习;了解有关 Laravel Passport 和 OAuth 2.0协议的更多信息,请参阅以下资源:
Laravel Passport 在 Laravel 文档中。
OAuth2.0 在 OAuth网站。
安装 Laravel Passport
要安装 Laravel Passport 并运行存储OAuth 2客户端所需的数据库迁移,请从项目根目录运行以下命令:
php artisan install:api --passport
接下来,导航到User
模型并添加Laravel\Passport\HasApiTokens
特征。 此特征提供了辅助方法,允许您检查用户的身份验证令牌和范围。 以下代码展示了如何将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
类的自定义模型后,指示 Passport 使用应用程序的App\Providers\AppServiceProvider
类的boot()
方法中的模型。 以下示例将每个自定义模型添加到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 模型类指南。