当前位置:首页>WordPress资讯>Laravel用户安全认证的综合指南

Laravel用户安全认证的综合指南

Laravel用户安全认证的综合指南

用户认证是Web应用程序最关键和最重要的功能之一。像Laravel这样的Web框架为用户提供了许多认证方式。

你可以快速而安全地实现Laravel的用户认证功能。然而, 实现这些用户安全认证功能不力会有风险, 因为恶意的人可以利用它们.

本指南将教你所有你需要知道的,以开始使用你选择的Laravel用户认证方法。

  1. Laravel用户认证介绍
  2. Laravel用户认证方法的类型
  3. 如何实现Laravel用户认证
  4. Laravel
  5. Laravel Jetstream
  6. Laravel
  7. Laravel
  8. Laravel Sanctum
  9. Laravel用户认证的技巧和最佳实践

Laravel用户认证介绍

Laravel引入了由 “守护者(guards)” 和 “提供者(providers)” 组成的模块。守护者为每个请求定义用户认证, 而提供者定义用户从持久性存储(如MySQL数据库)检索.

我们在一个名为 config/auth.php 的文件中定义我们的认证参数。它包括几个选项来调整和修改Laravel的用户认证行为。

首先, 你必须定义用户认证的默认值. 这个选项控制你的应用程序的默认用户认证 “防护” 和密码重置选项。你可以根据需要改变这些默认值, 但对于大多数应用程序来说, 它们是一个完美的开始.

接下来,你要为你的应用程序定义用户认证防护。这里,我们的默认配置使用会话存储和Eloquent用户提供者。所有的认证驱动都有一个用户提供者。

  1. return [
  2. /*
  3. Defining Authentication Defaults
  4. */
  5. 'defaults' => [
  6. 'guard' => 'web',
  7. 'passwords' => 'users',
  8. ],
  9. /*
  10. Defining Authentication Guards
  11. Supported: "session"
  12. */
  13. 'guards' => [
  14. 'web' => [
  15. 'driver' => 'session',
  16. 'provider' => 'users',
  17. ],
  18. ],
  19. /*
  20. Defining User Providers
  21. Supported: "database", "eloquent"
  22. */
  23. 'providers' => [
  24. 'users' => [
  25. 'driver' => 'eloquent',
  26. 'model' => App\Models\User::class,
  27. ],
  28. // 'users' => [
  29. // 'driver' => 'database',
  30. // 'table' => 'users',
  31. // ],
  32. ],
  33. /*
  34. Defining Password Resetting
  35. */
  36. 'passwords' => [
  37. 'users' => [
  38. 'provider' => 'users',
  39. 'table' => 'password_resets',
  40. 'expire' => 60,
  41. 'throttle' => 60,
  42. ],
  43. ],
  44. /*
  45. Defining Password Confirmation Timeout
  46. */
  47. 'password_timeout' => 10800,
  48. ];

后来,我们确保所有的用户认证驱动都有一个用户提供者。这定义了如何从你的数据库或其他存储机制中检索用户,以持久保存你的用户数据。如果你有多个用户表或模型,你可以配置多个代表每个模型或表的来源。这些源可以被分配给你定义的任何额外的用户认证卫士。

用户也可能想重置他们的密码。为此,如果你在应用程序中有多个用户表或模型,并希望根据特定的用户类型进行单独设置,你可以指定多个密码重置配置。过期时间是每个重置令牌的有效分钟数。这个安全功能使令牌的有效期很短,所以它们有更少的时间被猜中。你可以根据需要改变这一点。

最终,你必须定义密码确认超时前的时间,并提示用户通过确认屏幕重新输入密码。默认情况下,超时时间为三小时。

Laravel用户认证方法的类型

没有完美的方式来验证每一个场景, 但了解它们会帮助你做出更好的决定. 这和Laravel在Laravel 9中的新功能的发展情况。这使得我们在切换用户认证模式时,作为开发者的工作变得更加容易。

基于密码的用户认证

作为验证用户的基本方式,它仍然被成千上万的组织所使用,但考虑到目前的发展,它显然已经过时了。

供应商必须执行复杂的密码实现,同时确保对终端用户的摩擦最小。

它的工作原理非常简单,用户输入姓名和密码,如果在数据库中,这两者之间存在匹配,服务器就会决定对请求进行认证,并让用户在预定的时间内访问资源。

基于令牌的用户认证

这种方法的使用是在验证后向用户发放一个独特的令牌。

有了这个令牌,现在用户可以访问相关的资源。在令牌过期之前,该特权是有效的。

当令牌处于激活状态时,用户不必使用任何用户名或密码,但在检索新的令牌时,需要使用这两个。

今天,令牌被广泛地用于多种场景,因为它们是包含所有认证数据的无状态实体。

提供一种将令牌生成与令牌验证分开的方法给了供应商很大的灵活性。

多因子用户认证

顾名思义,它意味着使用至少两个认证因素,提高了它的安全性。

与只涉及两个因子的二步认证不同,这种方法可以涉及两个、三个、四个和更多的因素…。

这种方法的典型实施包括使用一个密码,之后用户会在他们的智能手机上收到一个验证码。实施这种方法的供应商应该注意假阳性和中断的问题,这在快速扩大规模时可能成为大问题。

如何实现Laravel用户认证

本节将教你多种方法来验证你的应用程序的用户。一些库,如Jetstream、Breeze和Socialite,都有免费的教程介绍如何使用它们。

传统用户认证

从注册用户开始,在 routes/web.php 中创建需要的路由。

我们将创建两条路线,一条用于查看表格,一条用于注册:

  1. use App\Http\Contrllers\Auth\RegisterController;
  2. use Illuminate\Support\Facades\Route;
  3. /*
  4. Web Routes
  5. Register web routes for your app's RouteServiceProvider
  6. in a group containing the "web" middleware
  7. */
  8. Route::get('/register', [RegisterController::class], 'create']);
  9. Route::post('/register', [RegisterController::class], 'store']);

并创建这些所需的控制器:

  1. php artisan make controller Auth/RegisterController -r

现在更新代码,如下:

  1. namespace App\Http\Controllers\Auth;
  2. use App\Http\Controllers\Controller;
  3. use illuminate\Htpp\Request;
  4. class RegisterController extends Controller
  5. {
  6. public function create()
  7. {
  8. return view('auth.register');
  9. }
  10. public function store(Request $request)
  11. {
  12. }
  13. }

控制器现在是空的,并返回一个视图来注册。让我们在 resources/views/auth 中制作这个视图,并将其称为 register.blade.php

Laravel用户安全认证的综合指南

用于注册用户的Laravel blade视图

现在一切就绪,我们应该访问我们的 /register 路线,并看到以下表格:

  1. public function store(Request $request)
  2. {
  3. $credentials = $request->only('email', 'password');
  4. if (Auth::attempt($credentials, $request->filled('remember'))) {
  5. $request->session()->regenerate();
  6. return redirect()->intended('/');
  7. }
  8. return back()->withErrors([
  9. 'email' => 'The provided credentials do not match our records.',
  10. ]);
  11. }

现在我们可以显示一个用户可以完成的表单,并获得其中的数据,我们应该获得用户的数据,对其进行验证,如果一切正常,再将其存储在数据库中。在这里,你应该使用一个数据库事务来确保你插入的数据是完整的。

我们将使用Laravel的请求验证功能来确保这三个凭证都是必需的。我们必须确保电子邮件有一个电子邮件格式,并且在 users 表中是唯一的,密码是确认的,并且至少有8个字符:

  1. namespace App\Http\Controllers\Auth;
  2. use App\Http\Controllers\Controller;
  3. use Illuminate\Foundation\Auth\User;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Hash;
  6. class RegisterController extends Controller
  7. {
  8. public function store(Request $request)
  9. {
  10. /*
  11. Validation
  12. */
  13. $request->validate([
  14. 'name' => 'required',
  15. 'email' => 'required|email|unique:users',
  16. 'password' => 'required|confirmed|min:8',
  17. ]);
  18. /*
  19. Database Insert
  20. */
  21. $user = User:;create([
  22. 'name' => $request->name,
  23. 'email' => $request->email,
  24. 'password' => Hash::make($request->password),
  25. ]);
  26. return back();
  27. }
  28. public function create()
  29. {
  30. return view('auth.register');
  31. }
  32. }

现在,我们的输入已被验证,任何违反验证的东西都会抛出一个错误,并显示在表单中:

Laravel用户安全认证的综合指南

无效的注册输入的例子

假设我们已经在 store 方法中创建了一个用户账户,我们还想登录该用户。我们有两种方法可以做到这一点。我们可以手动操作或使用Auth facade

在用户登录后,我们不应该让他们返回到注册界面,而应该返回到一个新的页面,比如仪表盘或主页。这就是我们在这里要做的:

  1. namespace App\Http\Controllers\Auth;
  2. use App\Http\Controllers\Controller;
  3. use App\Providers\RouteServiceProvider;
  4. use Illuminate\Foundation\Auth\User;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Hash;
  8. class RegisterController extends Controller
  9. {
  10. public function store(Request $request)
  11. {
  12. /*
  13. Validation
  14. */
  15. $request->validate([
  16. 'name' => 'required',
  17. 'email' => 'required|email|unique:users',
  18. 'password' => 'required|confirmed|min:8',
  19. ]);
  20. /*
  21. Database Insert
  22. */
  23. $user = User:;create([
  24. 'name' => $request->name,
  25. 'email' => $request->email,
  26. 'password' => Hash::make($request->password),
  27. ]);
  28. Auth::login($user):
  29. return redirect(RouteServiceProvider::HOME);
  30. }
  31. public function create()
  32. {
  33. return view('auth.register');
  34. }
  35. }

现在我们已经有一个用户注册并登录了 -n, 我们应该确保他可以安全地注销.

Laravel建议我们在注销后使会话失效并重新生成令牌以保证安全. 而这正是我们要做的. 我们首先使用LogoutController destroy 方法创建一个新的 /logout 路由:

  1. use App\Http\Controllers\Auth\RegisterController;
  2. use App\Http\Controllers\Auth\LogoutController;
  3. use Illuminate\Support\Facades\Route;
  4. /*
  5. Web Routes
  6. Here is where you can register web routes for your application. These
  7. routes are loaded by the RrouteServiceProvider with a group which
  8. contains the "web" middleware group. Now create something great!
  9. */
  10. Route::get('/register', [RegisterController::class, 'create']);
  11. Route::post('/register', ['RegisterController::class, 'store']);
  12. Route::post('/logout', [Logoutcontroller::class, 'destroy'])
  13. ->middleware('auth');

通过 “auth” 中间件传递注销信息是非常重要的。如果用户没有登录,他们应该无法访问该路线。

现在,像我们之前那样创建一个控制器:

  1. php artisan make:controller Auth/LogoutController -r

我们可以确保在 destroy 方法中获得作为参数的请求。我们通过Auth facade注销用户,使会话无效,然后重新生成令牌,然后将用户到主页:

  1. namespace App\Http\Controllers\Auth;
  2. use App\Http\Controllers\Controller;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\Auth;
  5. class LogoutController extends Controller
  6. {
  7. public function destroy(Request $request)
  8. {
  9. Auth::logout();
  10. $request->session()->invalidate();
  11. $request->session()->regenerateToken();
  12. return redirect('/');
  13. }
  14. }

保持登录

大多数(如果不是全部的话)现代网络应用程序在其登录表单上提供了一个 “remember me” 的复选框。

如果我们想提供一个 “remember me” 的功能, 我们可以传递一个布尔值作为尝试方法的第二个参数。

当有效时, Laravel会无限期地保持用户的身份验证,或直到他们被手动注销。用户表必须包括字符串 remember_token (这就是我们重新生成令牌的原因)列, 我们将在这里存储我们的 “remember me” 令牌.

用户的默认迁移已经包括了它。

首先,你必须在你的表单中添加Remember Me字段:

Laravel用户安全认证的综合指南

添加remember me字段表单

在这之后,从请求中获得证书并在Auth facade的尝试方法中使用它们。

如果用户应该被记住,我们将登录他并把他重定向到我们的主页。否则,我们将抛出一个错误:

  1. public function store(Request $request)
  2. {
  3. $credentials = $request->only('email', 'password');
  4. if (Auth::attempt($credentials, $request->filled('remember'))) {
  5. $request->session()->regenerate();
  6. return redirect()->intended('/');
  7. }
  8. return back()->withErrors([
  9. 'email' =>

重置密码

今天,大多数网络应用提供了让用户重置密码的途径。

我们将为忘记密码的用户制定另一个路由,并像我们一样创建控制器。此外,我们将为重置密码的链接添加一个路由,其中包含整个过程的令牌:

  1. Route::post('/forgot-password', [ForgotPasswordLinkController::class, 'store']);
  2. Route::post('/forgot-password/{token}', [ForgotPasswordController::class, 'reset']);

在存储方法中,我们将从请求中获取电子邮件,并像我们一样对其进行验证。

在这之后,我们可以使用密码界面的 sendResetLink 方法。

然后,作为一个响应,如果它成功地发送了链接,我们要返回状态,否则就是错误:

  1. namespace App\Http\Controllers\Auth;
  2. use App\Http\Controllers\Controller;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\Password;
  5. class ForgotPasswordLinkController extends Controller
  6. {
  7. public function store(Request $request)
  8. {
  9. $request->validate([
  10. 'email' => 'required|email',
  11. ]);
  12. $status = Password::sendResetLink(
  13. $request->only('email');
  14. );
  15. return $status === Password::RESET_LINK_SENT
  16. ? back()->with('status', __($status))
  17. : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]);
  18. }
  19. }

现在,重置链接已经发送到用户的邮箱,我们应该处理之后发生的逻辑问题。

我们将在请求中获得令牌,电子邮件和新密码,并验证它们。

在这之后, 我们可以使用密码界面的重置方法, 让Laravel来处理幕后的其他事情.

我们总是要对密码进行哈希处理以保证它的安全。

最后, 我们将检查密码是否被重置, 如果是的话, 我们将把用户重定向到登录界面, 并显示成功信息. 否则,我们会显示一个错误,说它无法被重置:

  1. namespace App\Http\Controllers\Auth;
  2. use App\Http\Controllers\Controller;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\Hash;
  5. use Illuminate\Support\Facades\Password;
  6. use Illuminate\Support\Str;
  7. class ForgotPasswordController extends Controller
  8. {
  9. public function store(Request $request)
  10. {
  11. $request->validate([
  12. 'token' => 'required',
  13. 'email' => 'required|email',
  14. 'password' => 'required|string|confirmed|min:8',
  15. ]);
  16. $status = Password::reset(
  17. $request->only('email', 'password', 'password_confirmation', 'token'),
  18. function ($user) use ($request) {
  19. $user->forceFill(
  20. 'password' => Hash::make($request->password),
  21. 'remember_token' => Str::random(60)
  22. ])->save();
  23. }
  24. );
  25. return $status == Password::PASSWORD_RESET
  26. ? redirect()->route('login')->with('status', __($status))
  27. : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]);
  28. }
  29. }

Laravel Breeze是Laravel用户认证功能的一个简单实现方案:登录,注册,密码重置,电子邮件验证和密码确认。你可以用它来实现你的新Laravel应用程序的认证。

安装和配置

在创建你的Laravel应用程序后,你所要做的就是配置你的数据库,运行你的迁移,并通过composer安装laravel/breeze软件包:

  1. composer require laravel/breeze dev

在这之后,运行以下内容:

  1. php artisan breeze:install

这将发布你的认证视图、路由、控制器和其他它使用的资源。在这一步之后,你可以完全控制Breeze所提供的一切。

现在我们必须把我们的应用程序渲染到前端,所以我们将安装我们的JS依赖(将使用@):

  1. install
  1. npm run dev

在这之后,登录和注册链接应该出现在你的主页上,一切都应该顺利进行。

Laravel Jetstream

Laravel Jetstream扩展了Laravel Breeze的有用功能和其他前端堆栈。

它提供了登录,注册,电子邮件验证,双因子认证,会话管理,通过Sanctum支持API,以及可选的团队管理。

在安装Jetstream时,你必须在前端的Livewire和Inertia之间进行选择。在后端,它使用Laravel Fortify,这是一个与前端无关的,用于Laravel的 “无头” 用户认证后端。

安装和配置

我们将通过composer在我们的Laravel项目中安装它:

  1. composer require laravel/jetstream

之后,我们将运行 php artisan jetstream:install [stack] 命令,该命令接受 [stack] 参数 Livewire 或 Inertia。你可以通过 –team 选项来启用团队功能。

这也将安装Pest PHP用于测试。

最后,我们要用下面的方法渲染我们应用程序的前端:

  1. npm install
  2. npm run dev

Laravel Fortify

Laravel Fortify是一个后端认证实现,与前端无关。你不需要使用Laravel Fortify来实现Laravel的认证功能.

它也被用在Breeze和Jetstream这样的入门套件中。你也可以单独使用Fortify, 这只是一个后端实现。如果你独立使用它, 你的前端必须调用Fortify路由。

安装和配置

我们可以通过composer来安装Fortify:

  1. composer require laravel/fortify

现在我们要发布Fortify的资源:

  1. php artisan vendor:publish provider="Laravel\Fortify\FortifyServiceProvider"

之后,除了新的FortifyServiceProvider、配置文件和数据库迁移之外,我们将创建一个新的app/Actions目录。

最后,运行:

  1. php artisan migrate

或者:

  1. php artisan migrate:fresh

而你的Fortify已经可以使用了。

Laravel Socialite

Laravel包括一个直接的基于OAuth的用户认证功能。它支持通过Facebook,,LinkedIn,Google,,GitHub和GitLab进行社交登录。

安装

我们可以通过composer来安装它:

  1. composer require laravel/socialite

配置和使用

安装完毕后,我们必须为我们的应用程序使用的OAuth提供者添加凭证。我们将在config/services.php中添加每个服务的凭证。

在配置中,我们应该与之前的服务匹配密钥。其中的一些密钥包括:

  • facebook
  • twitter (For OAuth 1.0)
  • twitter-oauth-2 (For OAuth 2.0)
  • linkedin
  • google
  • github
  • gitlab
  • bitbucket

OAuth用户认证服务配置可能看起来像这样:

  1. 'google' => [
  2. 'client_id' => env("GOOGLE_CLIENT_ID"),
  3. 'client_secret' => env("GOOGLE_CLIENT_SECRET"),
  4. 'redirect' => "http://example.com/callback-url",
  5. ],

验证用户身份

对于这个动作,我们将需要两条路由,一条用于将用户重定向到OAuth提供者:

  1. use Laravel\Socialite\Facades\Sociliate;
  2. Route::get('/auth/redirect', function () {
  3. return Socialite:;driver('google')->redirect();
  4. });

还有一个用于认证后的提供者的回调:

  1. use Laravel\Socialite\Facades\Socialite;
  2. Route:;get('/auht/callback', function () {
  3. $user = Socialite:;driver('google')->user();
  4. // Getting the user data
  5. $user->token;
  6. });

Socialite提供了重定向方法,门面将用户重定向到OAuth提供者,而用户方法则检查传入的请求并检索用户信息。

在我们收到用户后,我们要检查它是否存在于我们的数据库中,并对其进行认证。如果它不存在,我们将创建一个新的记录来代表该用户:

  1. use App\Models\User;
  2. use Illuminate\Support\Facades\Auth;
  3. use Laravel\Socialite\Facades\Socialite;
  4. Route::get('/auth/callback', function () {
  5. /*
  6. Get the user
  7. */
  8. $googleUser = Socialite::driver('google')->user();
  9. /*
  10. Create the user if it does not exist
  11. Update the user if it exists
  12. Check for google_id in database
  13. */
  14. $user = User::updateOrCreate([
  15. 'google_id' => $googleUser->id,
  16. ], [
  17. 'name' => $googleUser->name,
  18. 'email' => $googleUser->email,
  19. 'google_token' => $googleUser->token,
  20. 'google_refresh_token' => $googleUser->refreshToken,
  21. ]);
  22. /*
  23. Authenticates the user using the Auth facade
  24. */
  25. Auth::login($user);
  26. return redirect('/dashboard');
  27. });

如果我们想限制用户的访问范围,我们可以使用 scopes 方法,我们将在认证请求中包括该方法。这将把所有以前指定的作用域与指定的作用域合并。

另一种方法是使用 setScopes 方法,它可以覆盖所有其他现有的作用域:

  1. use Laravel\Socialite\Facades\Socialite;
  2. return Socialite::driver('google')
  3. ->scopes(['read:user', 'write:user', 'public_repo'])
  4. ->redirect();
  5. return Socialite::driver('google')
  6. ->setScopes(['read:user', 'public_repo')
  7. ->redirect();

现在我们知道了一切,知道了如何在回调后获得一个用户,让我们看看我们可以从中获得的一些数据。

OAuth1用户有 token 和 tokenSecret

  1. $user = Socialite::driver('google')->user();
  2. $token = $user->token;
  3. $tokenSecret = $user->tokenSecret;

OAuth2提供 tokenrefreshToken 和 expiresIn:

  1. $user = Socialite::driver('google')->user();
  2. $token = $user->token;
  3. $refreshToken = $user->refreshToken;
  4. $expiresIn = $user->expiresIn;

OAuth1和OAuth2都提供 getIdgetNicknamegetNamegetEmail 和 getAvatar:

  1. $user = Socialite::driver('google')->user();
  2. $user->getId();
  3. $user->getNickName();
  4. $user->getName();
  5. $user->getEmail();
  6. $user->getAvatar();

如果我们想从令牌(OAuth 2)或令牌和秘密(OAuth 1)中获取用户的详细信息,sanctum提供了两种方法:userFromToken 和 userFromTokenAndSecret:

  1. use Laravel\Socialite\Facades\Socialite;
  2. $user = Socialite:;driver('google')->userFromToken($token);
  3. $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

Laravel Sanctum

Laravel Sanctum是一个轻量用户认证系统,适用于SPAs(单页应用程序)和移动应用程序。它允许用户生成多个具有特定范围的API令牌。这些范围指定了一个令牌所允许的行动。

使用方法

Sanctum可以用来向用户发放API令牌,而不需要OAuth的复杂机制。这些令牌通常有很长的过期时间,比如几年,但用户可以在任何时候撤销并重新生成。

安装和配置

我们可以通过composer来安装它:

  1. composer require laravel/sanctum

而且我们必须发布配置和迁移文件:

  1. php artisan vendor:publish provider="Laravel\Sanctum\SanctumServiceProvider"

现在我们已经生成了新的迁移文件,我们必须对它们进行迁移:

  1.  

如何签发API令牌

在签发令牌之前,我们的用户模型应该使用Laravel\Sanctum\HasApiTokens特性:

  1. use Laravel\Sanctum\HasApiTokens;
  2. class User extends Authenticable
  3. {
  4. use HasApiTokens;
  5. }

当我们有了用户, 我们可以通过调用 createToken 方法来发行一个令牌,它将返回一个Laravel/Sanctum/NewAccessToken实例。

我们可以调用NewAccessToken实例的 plainTextToken 方法来查看令牌的SHA-256纯文本值。

Laravel用户认证的技巧和最佳实践

使其他设备上的会话无效

正如我们之前所讨论的,当用户注销时,使会话无效是至关重要的,但这也应该作为一个选项提供给所有拥有的设备。

这个功能通常在用户改变或更新他们的密码时使用,而我们想从任何其他设备上使他们的会话失效。

有了Auth facade,这是个很容易实现的任务。考虑到我们使用的路由有 auth 和 auth.session middleware,我们可以使用facade的 logoutOtherDevices 静态方法:

  1. Route::get('/logout', [LogoutController::class, 'invoke'])
  2. ->middleware(['auth', 'auth.session']);
  1. use Illuminate\Support\Facades\Auth;
  2. Auth::logoutOtherDevices($password);

使用Auth::routes()配置

Auth facade的routes方法只是一个帮助工具,用于生成用户认证所需的所有路线。

这些路由包括登录(Get, Post)、注销(Post)、注册(Get, Post)和密码重置/电子邮件(Get, Post)。

当你在facade上调用方法时,它会做以下工作:

  1. public static fucntion routes(array $options = [])
  2. {
  3. if (!static::$app->providerIsLoaded(UiServiceProvider::class)) {
  4. throw new RuntimeException('In order to use the Auth:;routes() method, please install the laravel/ui package.');
  5. }
  6. static::$app->make('router')->auth($options);
  7. }

我们感兴趣的是在路由器上调用静态方法时会发生什么。由于facades的工作方式,这可能很棘手,但下面调用的方法是这样的:

  1. /**
  2. Register the typical authentication routes for an application.
  3. @param array $options
  4. @return void
  5. */
  6. public function auth(array $options = [])
  7. {
  8. // Authentication Routes...
  9. $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
  10. $this->post('login', 'Auth\LoginController@login');
  11. $this->post('logout', 'Auth\LoginController@logout')->name('logout');
  12. // Registration Routes...
  13. if ($options['register'] ?? true) {
  14. $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
  15. $this->post('register', 'Auth\RegisterController@register');
  16. }
  17. // Password Reset Routes...
  18. if ($options['reset'] ?? true) {
  19. $this->resetPassword();
  20. }
  21. // Email Verification Routes...
  22. if ($options['verify'] ?? false) {
  23. $this->emailVerification();
  24. }
  25. }

默认情况下,它生成了除电子邮件验证以外的所有路由。我们将永远有登录和注销路线,但其他的路线我们可以通过选项数组来控制。

如果我们想只有登录/注销和注册,我们可以传递以下选项数组:

  1. $options = ["register" => true, "reset" => false, "verify" => false];

保护路由和自定义守卫

我们要确保一些路由只能由经过认证的用户访问,可以通过添加在路由门面上调用中间件方法或在其上连锁中间件方法来快速完成:

  1. Route::middleware('auth')->get('/user', function (Request $request) {
  2. return $request->user();
  3. });
  4. Route::get('/user', function (Request $request) {
  5. return $request->user();
  6. })->middleware('auth');

这个防护措施确保传入的请求得到验证。

密码确认

为了增加网站的安全性,你经常想在继续执行其他任务之前确认用户的密码。

我们必须从确认密码视图中定义一个路由来处理这个请求。它将验证并将用户重定向到他们预定的目的地。同时,我们将确保我们的密码在会话中出现确认。默认情况下,密码必须每三小时重新确认一次,但这可以在配置文件config/auth.php中改变:

  1. use Illuminate\Http\Request;
  2. use Illuminate\Support\Facades\Hash;
  3. use Illuminate\Support\Facades\Redirect;
  4. Route::post('/confirm-password', function (Request $request) {
  5. if (!Hash::check($request->password, $request->user()->password)) {
  6. return back()->withErrors([
  7. 'password' => ['The provided password does not match our records.']
  8. ]);
  9. }
  10. $request->session()->passwordConfirmed();
  11. return redirect()->intended();
  12. })->middleware(['auth']);

Authenticable合约

位于Illuminate/Contracts\Auth的Authenticable合约定义了UserProvider界面应该实现的blueprint:

  1. namespace Illuminate\Contracts\Auth;
  2. interface Authenticable
  3. {
  4. public function getAuthIdentifierName();
  5. public function getAuthIdentifier();
  6. public function getAuthPassord();
  7. public function getRememberToken();
  8. public function setRememberToken($value);
  9. public function getrememberTokenName();
  10. }

该接口允许用户认证系统与任何实现它的 “user” 类一起工作。

无论使用什么ORM或存储层, 这都是可行的. 默认情况下, Laravel有一个App\Models\User实现了这个接口, 这也可以在配置文件中看到:

  1. return [
  2. 'providers' => [
  3. 'users' => [
  4. 'driver' => 'eloquent',
  5. 'model' => App\Models\User::class,
  6. ],
  7. ],
  8. ];

身份认证事件

在整个认证过程中,有很多事件被派发。

根据你的目标,你可以在 EventServiceProvider 中给这些事件附加监听器。

Laravel用户安全认证的综合指南

为我们的认证服务生成的Laravel监听器的列表

快速创建新用户

创建一个新的用户可以通过App\User快速完成:

  1. $user = new App\User();
  2. $user->password = Hash::make('strong_password');
  3. $user->email = 'test-email@user.com';
  4. $user->name = 'Username';
  5. $user->save();

或者通过User facade上的创建静态方法:

  1. User::create([
  2. 'password' => Hash::make('strong-password'),
  3. 'email' => 'test-email@user.com',
  4. 'name' => 'username'
  5. ]);

小结

Laravel生态系统有很多启动工具包,可以让你的应用程序启动并运行一个用户认证系统,如Breeze和Jetstream。它们是高度可定制的,因为代码是在我们这边生成的,我们可以随心所欲的修改它,如果需要的话,可以把它作为一个蓝本。

关于用户认证和它的复杂性,有很多安全问题,但所有这些都可以通过Laravel提供的工具轻松解决。这些工具是高度可定制的,而且易于使用。

原文地址:https://www.wbolt.com/laravel-authentication.html

WordPress资讯

VS Code键盘快捷键大全:简化编码工作流程和提升敲代码效率

2024-1-22 1:07:45

WordPress资讯

WP Job Manager – WordPress企业职位招聘信息管理插件

2024-1-22 1:07:50

个人中心
今日签到
私信列表
搜索