You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的HasApiTokens Trait:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:57:01