Laravel 中如何实现用户认证
Laravel 新项目可用当前官方 React、Vue、Svelte 或 Livewire 起始套件接入认证;介绍 Auth/Request、路由保护、登录会话更新与安全退出。
直接回答:新项目优先使用与你安装的 Laravel 主版本对应的官方起始套件;Laravel 13 文档提供 React、Vue、Svelte 和 Livewire 选择。已有项目使用 Auth/Request 和中间件接入现有认证流程,不能把“读取当前用户”当作已实现登录。Breeze/Jetstream 应按旧项目的版本与维护需求评估,不是当前所有新项目的默认组合。
用起始套件快速生成认证
已安装官方 Laravel installer 时,新建项目并在交互步骤选择起始套件:
laravel new example-app
cd example-app
npm install
npm run build
先配置专用开发数据库,再运行 php artisan migrate;这会修改数据库结构,不能对未知或生产数据库直接执行。当前起始套件基于框架认证能力提供相应界面与流程;功能以选定套件文档为准。
Breeze 是较轻量的旧版 scaffold 方案;Jetstream 是独立套件,不是“在 Breeze 代码上追加”的安装步骤,团队功能等选项也需单独启用。不要把任一生成器直接套入已有业务项目覆盖文件。
获取当前认证用户
方式一:Auth facade
use Illuminate\Support\Facades\Auth;
$user = Auth::user(); // 当前登录用户模型实例,未登录为 null
$id = Auth::id(); // 当前用户 ID
方式二:在控制器中类型提示 Request
use Illuminate\Http\Request;
public function show(Request $request)
{
$user = $request->user();
}
方式三:路由闭包中
Route::get('/profile', function (Request $request) {
return $request->user()->only(['name', 'email']);
})->middleware('auth');
保护路由
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
未登录访客访问 auth 中间件保护的路由会被重定向到登录页;API 场景使用 auth:sanctum。
手动认证(自定义登录逻辑时)
use Illuminate\Support\Facades\Auth;
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
$request->session()->regenerate(); // 防会话固定攻击,必须做
return redirect()->intended('/dashboard');
}
上面是已有控制器中的局部片段,不是完整登录接口。还需校验输入、限流、CSRF 防护、错误处理以及安全 Cookie 设置。attempt() 校验框架支持的密码哈希,不要用 md5/sha1。退出时调用 Auth::logout()、$request->session()->invalidate() 和 $request->session()->regenerateToken()。
常见问题(FAQ)
Q:Breeze 和 Jetstream 怎么选?
A:先核对 Laravel 主版本及各套件支持范围。旧项目可按已有栈维护,新项目参考当前官方 starter kits,不要仅凭旧教程默认安装 Breeze/Jetstream。
Q:已有用户表,不想用起始套件重建怎么办?
A:起始套件只做 scaffold,可以只参考它生成的控制器逻辑;或直接使用 Auth::attempt()、Auth::login($user) 手动接入现有表结构,只要 User 模型实现了 Authenticatable 契约即可。
Q:Auth::user() 返回 null 但用户明明登录了?
A:先确认路由在 web 中间件组内(API 路由默认无会话),再检查 config/session.php 的 domain 配置是否导致 Cookie 没带上;SPA 前后端分离场景要用 Sanctum 的令牌或 Cookie 认证模式。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。