Laravel 用户认证与注册

用户认证是大多数 Web 应用的核心功能。Laravel 提供了开箱即用的认证系统,包括用户注册、登录、密码重置、邮箱验证等。你可以使用内置的 UI 脚手架快速搭建,也可以手动实现完全自定义的认证逻辑。本章将全面介绍 Laravel 的认证机制,帮助你构建安全可靠的身份验证系统。

🔐 核心组件: Laravel 认证系统主要由 guards(认证守卫)和 providers(用户提供者)组成。守卫定义了如何认证用户(如 session、token),提供者定义了如何从存储中获取用户(如 Eloquent、数据库)。

1. 快速启动:内置 UI 脚手架

Laravel 11 移除了官方的 UI 包,推荐使用 Laravel BreezeLaravel 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 还提供了控制器、路由和视图,你可以在此基础上自由修改。

2. 手动实现用户认证

如果你不想使用脚手架,可以手动构建认证逻辑。Laravel 的 Auth Facade 提供了简洁的 API。

2.1 注册流程

控制器中验证用户输入,创建用户并登录。


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');
}
                    

2.2 登录流程


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' => '提供的凭证不匹配我们的记录。',
    ]);
}
                    

2.3 登出


public function logout(Request $request)
{
    Auth::logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();
    return redirect('/');
}
                    

3. 使用认证中间件保护路由

通过 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
                    

4. 获取已认证用户


// 通过 Facade
$user = Auth::user();

// 通过辅助函数
$user = auth()->user();

// 获取用户 ID
$id = Auth::id();

// 检查是否已登录
if (Auth::check()) { ... }
                    

5. 密码重置功能

Laravel 提供了内置的密码重置功能,需要配置邮件系统。使用以下命令生成相关表和视图(Breeze 已包含):


php artisan make:auth  // 旧版本,Laravel 11 使用 Breeze
                    

手动实现时,你需要:

  1. 用户输入邮箱,系统发送重置链接。
  2. 用户点击链接,验证 token 后重置密码。
使用 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();
    }
);
                    

6. 邮箱验证

要求用户注册后验证邮箱地址,可以防止恶意注册。Laravel 提供了 MustVerifyEmail 契约。在 User 模型中实现:


use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}
                    

然后添加路由中间件 verified 来保护需要验证邮箱才能访问的路由。


Route::get('/dashboard', function () {
    // 需要邮箱已验证
})->middleware(['auth', 'verified']);
                    

7. 授权策略(Gate 和 Policy)

认证解决“你是谁”,授权解决“你能做什么”。Laravel 提供两种授权方式。

7.1 Gate(门禁)

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
                    

7.2 Policy(策略)

对于模型相关的授权,推荐使用 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);
    // ...
}
                    

8. 最佳实践与安全提示

  • 使用 HTTPS: 生产环境务必使用 HTTPS,防止密码和 Session 被窃听。
  • 密码哈希: 始终使用 Hash::make()bcrypt() 存储密码,切勿明文存储。
  • 登录限制: 使用 Laravel 的速率限制器防止暴力破解。
  • 记住我功能: 使用 attempt 方法的第二个参数实现安全的“记住我”。
  • 登出时清理 Session: 务必调用 invalidate()regenerateToken()
  • 自定义认证守卫: 如果有多用户类型(如管理员和普通用户),可以配置多个守卫。
💡 提示: 对于 API 认证,推荐使用 Laravel Sanctum 或 Passport(基于 Token),而不是 Session。

9. 总结

Laravel 的认证系统功能强大且易于扩展。你可以通过内置脚手架快速搭建,也可以手动定制每个环节。结合授权策略,你可以精确控制用户的操作权限。掌握这些知识,将为构建安全、健壮的 Web 应用打下坚实基础。

📖 官方文档: AuthenticationAuthorization 提供了更全面的指南。