laravel - 如何在 laravel 中间件中为路由添加 OR 关系
问题描述
我正在使用spatie/laravel-permission为我的路线添加权限。
我拥有的路线之一可以通过两个权限(earnings
,financial_fund
)访问。用户无需同时拥有这两种权限即可访问控制器。他可以通过拥有其中一个权限或同时拥有这两个权限来访问控制器。
我试过写这样的东西。
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
权限的用户。
我也试过写这样的东西
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 文件中使用它?
解决方案
我通过创建一个新的中间件来修复它
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 文件
protected $routeMiddleware = [
...,
'canAny' => AuthorizeCanAny::class,
];
然后在路由器中使用
Route::group(['middleware' => ['canAny:earnings,financial_fund']], function () {
Route::get('/payment', [PaymentsController::class, 'getAll']);
Route::post('/payment/cash', [PaymentsController::class, 'addCashPayment']);
});
推荐阅读
- c++ - RegisterEventSource(0, "App1.exe") => 如果 ...\Eventlog 注册表项下有多个“App1.exe”怎么办?
- android - Jetpack 组合性能
- python - 无法使用 sqlalchemy 提交()更新的数据无法找到问题所在
- reactjs - 在 ag 网格中单击节点的复选框后,有没有办法防止列组折叠?
- r - 如何放大树状图以便被吞没的标签可以重新出现?
- kotlin - 房间数据库 - 将数据库中的值与用户输入进行比较以进行验证
- hangfire - 使 Hangfire 仪表板全宽(和自定义样式)
- python - 坐标的唯一标识符 (place_id)
- java - 使用 Google Sheets API (v4) 格式化单元格(输入 Duration)
- npm - 无法使用 AWS-SDK 浏览 hello world