跳转到主要内容

什么是认证

认证(Authentication)指的是确认访问用户「是谁」的机制。 在 Web 应用中,通常是通过登录表单接收邮箱和密码,若匹配成功就把用户信息保存到 Session 中。 之后的请求就通过该 Session 识别用户。 Laravel 的认证功能由「守卫(Guard)」和「Provider(用户提供者)」两个概念组成。
  • 守卫:定义在每个请求中如何认证用户。默认使用 session 守卫,通过 Session 与 Cookie 管理状态。
  • Provider:定义如何从数据源中取出用户。默认使用 Eloquent。
认证的配置文件是 config/auth.php。默认设置就足以覆盖大多数 Web 应用。

通过启动套件搭建认证

在 Laravel 中,只需在通过 laravel new 创建应用时选择启动套件,就会自动构建登录、注册、密码重置等认证功能。这是最推荐的方式。
1

创建应用

使用 Laravel 安装器创建应用,过程中会有选择启动套件的提示。
laravel new my-app
启动套件可以从 ReactVueLivewireSvelte 中选择。 请结合团队的技术栈来选。
2

安装前端依赖

cd my-app
npm install && npm run build
3

准备数据库

确认 .env 中的数据库配置后运行迁移。
php artisan migrate
包含 users 表的初始迁移会被应用。
4

启动开发服务器

composer run dev
在浏览器中访问 http://localhost:8000,导航栏会显示「Register」与「Log in」链接。 可以访问 /register 试着注册用户。
使用启动套件后,你立即拥有以下功能:
功能URL
用户注册/register
登录/login
密码重置/forgot-password
邮箱验证/email/verify
个人资料编辑/settings/profile
启动套件生成的所有代码(控制器、路由、视图)都存在于你自己的应用中,可以自由地修改和定制。

可用的启动套件

React

采用 React 19、TypeScript、Tailwind 及 shadcn/ui,可构建现代化 SPA。 通过 Inertia,可以在保留服务端路由的同时使用 React 前端。

Vue

采用 Vue Composition API、TypeScript、Tailwind 与 shadcn-vue。 同样使用 Inertia 与服务端连接。

Livewire

使用 Livewire,只需 PHP 就能构建动态 UI。 适合以 Blade 模板为主的团队,或希望不使用 JavaScript 框架的场景。 内置 Flux UI 组件库。

Svelte

采用 Svelte 5、TypeScript、Tailwind 与 shadcn-svelte。 结合 Inertia 可构建现代化 SPA。

认证门面

使用 Auth 门面可以获取当前已认证用户的信息或判断认证状态。

获取已认证用户

use Illuminate\Support\Facades\Auth;

// 获取当前用户
$user = Auth::user();

// 只获取用户 ID
$id = Auth::id();
在控制器中也可以从 Request 对象获取用户。
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class DashboardController extends Controller
{
    public function index(Request $request)
    {
        $user = $request->user();

        return view('dashboard', ['user' => $user]);
    }
}

判断认证状态

Auth::check() 会以 true / false 返回用户是否已登录。
use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // 已登录
} else {
    // 未登录
}
在 Blade 模板中,使用 @auth@guest 指令会更方便。
@auth
    <p>你好,{{ Auth::user()->name }}</p>
    <a href="/logout">登出</a>
@endauth

@guest
    <a href="/login">登录</a>
    <a href="/register">注册</a>
@endguest

路由保护

要创建只允许已登录用户访问的路由,请使用 auth 中间件。
// routes/web.php

// 仅已认证用户可访问
Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware('auth');
未认证用户访问时会自动被重定向到 /login 要一次性保护多个路由,可使用分组。
Route::middleware('auth')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [ProfileController::class, 'show']);
    Route::get('/settings', [SettingsController::class, 'index']);
});
忘加 auth 中间件会让未登录用户也能访问。需要保护的路由请务必加上。

仅访客路由

要将已登录用户重定向到别处,可使用 guest 中间件。 对登录和注册页面使用它,可以把已登录用户直接跳转到仪表盘。
Route::middleware('guest')->group(function () {
    Route::get('/login', [AuthController::class, 'showLogin']);
    Route::get('/register', [AuthController::class, 'showRegister']);
});

手动认证

不使用启动套件、手动实现登录时可使用 Auth::attempt()
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    public function login(Request $request): RedirectResponse
    {
        $credentials = $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        if (Auth::attempt($credentials)) {
            // 认证成功 — 重新生成 Session 以防 CSRF
            $request->session()->regenerate();

            return redirect()->intended('/dashboard');
        }

        // 认证失败
        return back()->withErrors([
            'email' => '邮箱或密码不正确。',
        ])->onlyInput('email');
    }
}
Auth::attempt() 的第一个参数是凭据数组。 密码会自动与哈希比对,因此直接传入明文即可。 要实现「记住登录状态」功能,把 true 作为第二个参数传入。
// 使用「记住我」复选框的值
Auth::attempt($credentials, $request->boolean('remember'));
即使自己实现认证,也建议参考启动套件的代码——它是安全实现的好范本。

登出

要登出用户,请调用 Auth::logout()。 最佳实践是同时使 Session 失效并重新生成 CSRF 令牌。
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

class LogoutController extends Controller
{
    public function logout(Request $request): RedirectResponse
    {
        Auth::logout();

        // 使 Session 失效
        $request->session()->invalidate();

        // 重新生成 CSRF 令牌
        $request->session()->regenerateToken();

        return redirect('/');
    }
}
路由使用 POST 方法。
Route::post('/logout', [LogoutController::class, 'logout'])->middleware('auth');
Blade 模板中通过表单发送 POST 请求。
<form method="POST" action="/logout">
    @csrf
    <button type="submit">登出</button>
</form>

小结

想做的事方法
快速添加认证功能使用启动套件(laravel new
获取当前用户Auth::user() / $request->user()
判断登录状态Auth::check()
保护路由->middleware('auth')
手动登录Auth::attempt($credentials)
登出Auth::logout()

下一步

中间件

详细了解 auth 中间件的机制及如何编写自定义中间件。
最后修改于 2026年7月13日