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

Laravel API权限控制:如何仅允许Client角色创建工单?

实现仅Client角色用户创建工单的权限控制

嘿,我来帮你搞定这个需求!针对仅允许Client角色用户提交工单的场景,有两种实用的实现方式,我给你一步步说明:

方法一:直接在控制器方法内校验(快速实现)

首先先修正你代码里的两个小问题:

  • $ticket->save; 应该写成 $ticket->save();,否则会调用失败
  • 原代码里的desciption拼写错误,要改成description

然后在store方法开头添加角色校验逻辑,确保当前登录用户是Client角色:

public function store(Request $request) : TicketResource { 
    // 校验用户角色
    if (auth()->user()->role->name !== 'Client') {
        return response()->json(['message' => '仅Client角色可创建工单'], 403);
    }

    $ticket = new Ticket(); 
    $ticket->title = $request->title; 
    $ticket->description = $request->description; 
    $ticket->user_id = auth()->user()->id; 
    $ticket->department_id = $request->department_id; 
    $ticket->save(); 
    return new TicketResource($ticket); 
}

注意:这里假设你的User模型已经定义了和Role的关联关系,比如在User.php里有:

public function role()
{
    return $this->belongsTo(Role::class);
}

方法二:自定义中间件(优雅且可复用)

如果后续还有其他路由需要校验Client角色,推荐用自定义中间件的方式,更符合Laravel的最佳实践:

1. 生成中间件

运行Artisan命令创建中间件:

php artisan make:middleware EnsureUserIsClient

2. 编写中间件逻辑

打开app/Http/Middleware/EnsureUserIsClient.php,修改handle方法:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class EnsureUserIsClient
{
    public function handle(Request $request, Closure $next)
    {
        if (auth()->user()->role->name !== 'Client') {
            return response()->json(['message' => '仅Client角色可执行此操作'], 403);
        }

        return $next($request);
    }
}

3. 注册中间件

打开app/Http/Kernel.php,在$routeMiddleware数组里添加中间件别名:

protected $routeMiddleware = [
    // ...其他已存在的中间件
    'client' => \App\Http\Middleware\EnsureUserIsClient::class,
];

4. 在路由中使用中间件

修改你的api.php路由,给工单创建路由加上client中间件:

Route::group(['middleware' => 'auth:api'], function(){ 
    Route::post('tickets', 'Api\TicketController@store')->middleware('client'); 
});

这样以后任何需要限制Client角色的路由,直接加上->middleware('client')就可以了,非常方便复用。

另外补充:如果你的角色判断需要更灵活(比如后续加更多角色),也可以考虑用Laravel的权限包,但当前场景用上面两种方法完全足够啦。

内容的提问来源于stack exchange,提问作者Danabek Duisekov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:00:10