本文共 2305 字,大约阅读时间需要 7 分钟。
Laravel 提供强大的认证系统,主要包括两部分:Guard(.guard)和 Provider(.provider)。Guard 负责对用户身份进行验证,而 Provider 负责从持久化存储(如数据库)中加载用户数据。
Guard Provider 的常见实现包括使用 Eloquent DB 存储。用户通过 session guardproviders 从持久化存储中获取用户信息。默认的认证配置通常无需修改即可使用。
使用 Laravel 的认证功能,可以通过以下命令快速初始化:
php artisan make:auth
|| 使用 redirect()
方法指定登录成功后的跳转地址,方法优先级高于属性定义:
protected function redirectTo() { return '/path';}
|| 可以通过修改 username()
方法返回自定义字段:
public function username() { return 'username';}
|| 自定义 Guard:
use Illuminate\Support\Facades\Auth;protected function guard() { return Auth::guard('guard-name');}
|| 在路由中指定 Guard:
->middleware('auth:api')
|| 失败次数过多会阻止登录判定,标准基于 username
方法返回值和 IP:
if (Auth::attempt(['email' => $email, 'password' => $password])) { return redirect()->intended('dashboard');}
如果不喜欢默认控制器可以手动认证用户,通过 Auth::attempt()
方法。如:
if (Auth::attempt(['email' => $email, 'password' => $password])) { return redirect()->intended('dashboard');}
如果需要额外条件:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) { // active 字段必须为 1}
如果要使用特定的 Guard:
if (Auth::guard('admin')->attempt($credentials)) { // 指定 Guard 登录}
Auth::logout();
记住用户设置为无限期:
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { // 用户被记住...}
判断是否选择记住:
if (Auth::viaRemember()) { // ...}
API 认证通常在路由中使用 middleware:
Route::post('/api/auth', function () { // ...})->middleware('auth:api');
Gates 通常使用闭包定义简单逻辑,而 Policies 主要用于与模型或资源相关的复杂权限控制。
定义 Gates:
Gate::define('update-post', function ($user, $post) { return $user->id == $post->user_id;});
Polices 示例:
namespace App\Policies;use App\Models\Post;class PostPolicy{ public function update(User $user, Post $post) { return $user->id == $post->user_id; }}
Laravel 提供强大的加密功能,主要包括 encrypt
和 decrypt
。
$encrypted = Crypt::encryptString('Hello world!');$decrypted = Crypt::decryptString($encrypted);
如果序列化需要加密:
try { $decrypted = decrypt($encryptedValue);} catch (DecryptException $e) { // ...}
使用 Laravel Hash 对密码进行加密。生成哈希:
$passwordIntoDB = Hash::make($request->newPassword);
验证哈希:
if (Hash::check('plain-text', $hashedPassword)) { // 密码匹配}
检查是否需要重新哈希:
if (Hash::needsRehash($hashed)) { $hashed = Hash::make('plain-text');}
转载地址:http://lkgyk.baihongyu.com/