首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在路由的laravel中间件中添加OR关系

如何在路由的laravel中间件中添加OR关系
EN

Stack Overflow用户
提问于 2021-08-15 08:15:55
回答 1查看 200关注 0票数 1

我正在使用spatie/laravel-permission为我的路由添加权限。

我拥有的其中一个路由可以通过两个权限(earningsfinancial_fund)访问。用户不需要同时拥有访问控制器的两个权限。他可以通过拥有其中一个或两个权限来访问控制器。

我试过写这样的东西。

代码语言:javascript
运行
复制
Route::group(['middleware' => ['can:earnings']], function () {
    Route::get('/payment', [PaymentsController::class, 'getAll']);
    Route::post('/payment/cash', [PaymentsController::class, 'addCashPayment']);
});
Route::group(['middleware' => ['can:financial_fund']], function () {
    Route::get('/payment', [PaymentsController::class, 'getAll']);
    Route::post('/payment/cash', [PaymentsController::class, 'addCashPayment']);
});

但是上面的代码只允许具有can:earnings权限的用户访问路由,而不允许具有can:financial_fund权限的用户访问路由。

我也试过写这样的东西

代码语言:javascript
运行
复制
Route::group(['middleware' => ['can:earnings,financial_fund']], function () {
    Route::get('/payment', [PaymentsController::class, 'getAll']);
    Route::post('/payment/cash', [PaymentsController::class, 'addCashPayment']);
});

但这需要当前用户同时拥有这两个权限。

我怎么知道我只想要其中一个权限存在呢?

我发现Laravel在刀片模板中引入了canAny。在定义路由时,有没有办法在我的api.php文件中使用它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-16 06:25:04

我通过创建一个新的中间件修复了它

代码语言:javascript
运行
复制
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class AuthorizeCanAny
{
    public function handle(Request $request, Closure $next, ...$permissions)
    {
        if (!$request->user()) {
            abort(403);
        }

        $userPermissions = array_map(function ($e) {
            return $e['name'];
        }, $request->user()->permissions->toArray());

        $userPermissionsIntersect = array_intersect($userPermissions, $permissions);

        if (!sizeof($userPermissionsIntersect)) {
            abort(403);
        }

        return $next($request);
    }
}

将中间件添加到kernal.php文件中

代码语言:javascript
运行
复制
protected $routeMiddleware = [
    ...,
    'canAny' => AuthorizeCanAny::class,
];

然后在路由器中使用它

代码语言:javascript
运行
复制
Route::group(['middleware' => ['canAny:earnings,financial_fund']], function () {
    Route::get('/payment', [PaymentsController::class, 'getAll']);
    Route::post('/payment/cash', [PaymentsController::class, 'addCashPayment']);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68789807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档