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
相关产品推荐
相关产品推荐

