PHP Laravel 8开发活动网站后端的用户token化与权限控制问题
Laravel 8 活动站点Token认证与权限校验实现方案
一、用户侧Token化处理
直接使用Laravel官方提供的Sanctum扩展实现Token认证,轻量且适配API场景:
- 第一步:安装配置Sanctum
若项目未预装Sanctum,执行安装命令:composer require laravel/sanctum
发布配置文件与迁移表:php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
执行数据库迁移生成Token存储表:php artisan migrate
打开app/Http/Kernel.php,在api中间件组中加入Sanctum状态校验中间件:protected $middlewareGroups = [ 'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; - 第二步:用户模型关联Token能力
打开app/Models/User.php,引入Sanctum的HasApiTokensTrait:use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // 原有模型代码保持不变 } - 第三步:登录接口返回Token
登录逻辑验证用户账号密码通过后,生成用户Token并返回:
前端后续请求时,在请求头携带// 账号密码校验通过后 $token = $user->createToken('user_login_token')->plainTextToken; return response()->json([ 'code' => 200, 'token' => $token, 'user_info' => $user ]);Authorization: Bearer <获取到的Token>即可完成身份识别。 - 第四步:登出销毁Token
登出接口中销毁当前用户使用的Token:auth()->user()->currentAccessToken()->delete(); return response()->json(['message' => '登出成功']);
二、用户权限校验实现
当前仅需要区分普通用户与管理员,直接新增角色字段+自定义中间件即可实现,无需引入额外权限包:
- 第一步:用户表新增角色字段
生成字段新增迁移:php artisan make:migration add_role_to_users_table --table=users
打开生成的迁移文件,修改up方法:
执行迁移更新用户表:public function up() { Schema::table('users', function (Blueprint $table) { $table->enum('role', ['user', 'admin'])->default('user')->comment('用户角色:user普通用户 admin管理员'); }); }php artisan migrate - 第二步:创建管理员权限校验中间件
执行生成中间件命令:php artisan make:middleware CheckAdminRole
打开生成的app/Http/Middleware/CheckAdminRole.php,修改handle方法逻辑:public function handle(Request $request, Closure $next) { // 非管理员角色直接返回403无权限 if (auth()->user()->role !== 'admin') { return response()->json(['message' => '无权限执行该操作'], 403); } return $next($request); } - 第三步:注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组中新增中间件别名:protected $routeMiddleware = [ // 原有中间件保持不变 'admin' => \App\Http\Middleware\CheckAdminRole::class, ]; - 第四步:路由绑定权限
打开routes/api.php,按权限层级配置路由:// 公开接口,无需登录 Route::post('/login', [AuthController::class, 'login']); // 需要登录的接口组 Route::middleware('auth:sanctum')->group(function () { Route::post('/logout', [AuthController::class, 'logout']); Route::get('/activities', [ActivityController::class, 'index']); // 普通用户可查看活动列表 // 其他所有用户都能访问的接口放这里 // 仅管理员可访问的接口组 Route::middleware('admin')->group(function () { Route::post('/activities', [ActivityController::class, 'store']); // 活动添加接口 // 其他管理员专属接口放这里 }); });
内容的提问来源于stack exchange,提问作者Mukul Kadyan
相关产品推荐
相关产品推荐

