用户认证是大多数 Web 应用的核心功能。Laravel 提供了开箱即用的认证系统,包括用户注册、登录、密码重置、邮箱验证等。你可以使用内置的 UI 脚手架快速搭建,也可以手动实现完全自定义的认证逻辑。本章将全面介绍 Laravel 的认证机制,帮助你构建安全可靠的身份验证系统。
guards(认证守卫)和 providers(用户提供者)组成。守卫定义了如何认证用户(如 session、token),提供者定义了如何从存储中获取用户(如 Eloquent、数据库)。
Laravel 11 移除了官方的 UI 包,推荐使用 Laravel Breeze 或 Laravel Jetstream 快速生成认证界面。以下以 Breeze 为例:
# 安装 Breeze
composer require laravel/breeze --dev
# 生成 Blade 认证视图(包括登录、注册、密码重置)
php artisan breeze:install blade
# 安装前端依赖并编译
npm install
npm run build
# 运行迁移(创建用户表)
php artisan migrate
安装完成后,访问 /login、/register 即可使用现成的认证界面。Breeze 还提供了控制器、路由和视图,你可以在此基础上自由修改。
如果你不想使用脚手架,可以手动构建认证逻辑。Laravel 的 Auth Facade 提供了简洁的 API。
控制器中验证用户输入,创建用户并登录。
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
// 注册后自动登录
Auth::login($user);
return redirect('/dashboard');
}
use Illuminate\Support\Facades\Auth;
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($credentials, $request->filled('remember'))) {
$request->session()->regenerate();
return redirect()->intended('dashboard');
}
return back()->withErrors([
'email' => '提供的凭证不匹配我们的记录。',
]);
}
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
通过 auth 中间件可以限制只有已登录用户才能访问某些路由。
Route::get('/dashboard', function () {
// 只有已登录用户可访问
})->middleware('auth');
// 或使用控制器
Route::resource('posts', PostController::class)->middleware('auth');
在视图中,你可以使用 @auth 指令根据登录状态显示不同内容:
@auth
<p>欢迎回来,{{ Auth::user()->name }}</p>
@endauth
@guest
<a href="/login">登录</a>
@endguest
// 通过 Facade
$user = Auth::user();
// 通过辅助函数
$user = auth()->user();
// 获取用户 ID
$id = Auth::id();
// 检查是否已登录
if (Auth::check()) { ... }
Laravel 提供了内置的密码重置功能,需要配置邮件系统。使用以下命令生成相关表和视图(Breeze 已包含):
php artisan make:auth // 旧版本,Laravel 11 使用 Breeze
手动实现时,你需要:
Password Facade 可以简化操作:
use Illuminate\Support\Facades\Password;
// 发送重置链接
$status = Password::sendResetLink($request->only('email'));
// 重置密码
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user, $password) {
$user->password = Hash::make($password);
$user->save();
}
);
要求用户注册后验证邮箱地址,可以防止恶意注册。Laravel 提供了 MustVerifyEmail 契约。在 User 模型中实现:
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable implements MustVerifyEmail
{
// ...
}
然后添加路由中间件 verified 来保护需要验证邮箱才能访问的路由。
Route::get('/dashboard', function () {
// 需要邮箱已验证
})->middleware(['auth', 'verified']);
认证解决“你是谁”,授权解决“你能做什么”。Laravel 提供两种授权方式。
在 App\Providers\AuthServiceProvider 中定义能力。
use Illuminate\Support\Facades\Gate;
public function boot()
{
Gate::define('update-post', function ($user, $post) {
return $user->id === $post->user_id;
});
}
在控制器或视图中使用:
if (Gate::allows('update-post', $post)) {
// 用户可以更新
}
@can('update-post', $post)
<a href="#">编辑</a>
@endcan
对于模型相关的授权,推荐使用 Policy。生成策略:
php artisan make:policy PostPolicy --model=Post
然后在 AuthServiceProvider 中注册:
protected $policies = [
Post::class => PostPolicy::class,
];
在策略中定义方法:
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
控制器中使用 authorize 方法:
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
// ...
}
Hash::make() 或 bcrypt() 存储密码,切勿明文存储。attempt 方法的第二个参数实现安全的“记住我”。invalidate() 和 regenerateToken()。Laravel 的认证系统功能强大且易于扩展。你可以通过内置脚手架快速搭建,也可以手动定制每个环节。结合授权策略,你可以精确控制用户的操作权限。掌握这些知识,将为构建安全、健壮的 Web 应用打下坚实基础。