dcat-admin
dcat-admin copied to clipboard
dcat 的权限使用问题
- Laravel Version: 8.61.0
- PHP Version: 8.0.18
- Dcat Admin Version: 2.1.5-beta
Description:
背景:前期项目使用 laravel 做服务端,提供 api(粗算了下 route 有 500+),中间一段时间前端开发资源紧张,引入了 DcatAdmin,后端直接写页面。
按文档中提及,共有 3 种方式启用权限:
- 通过路由控制(但是由于 dcat 是后期接入,路由会被拼接
admin.route.prefix,⚠️ 截止220413我没找到合适的方法 - 通过中间件的形式控制(目前启用的是这种 ✅
Route::prefix('xxx_task')->namespace('Goods')->middleware([
'xxx.refresh',
'admin.permission:allow,administrator,spu-mgr', //`角色`名 role
])->group(function () {
Route::get('list', 'XxxTaskController@list');
//其他省略
});
- 使用提供的相关方法,提供更细粒度的控制
Admin::user()->isRole('developer'); //用户是否有某个角色
Admin::user()->can('create-post'); //是否有某个权限
Admin::user()->cannot('delete-post'); //是否没有某个权限
Admin::user()->isAdministrator(); //是否是超级管理员
Admin::user()->inRoles(['editor', 'developer']); //是否是其中的角色
但是我在使用2方案的时候,遇到了如下问题
Steps To Reproduce:
配置 'admin.permission:allow,administrator,spu-mgr' 在调用中间件的时候,执行如下代码
// Dcat\Admin\Http\Middleware/Permission
public function handle(Request $request, \Closure $next, ...$args)
{
$user = Admin::user();
if (
! $user
|| ! empty($args) // ⚠️ 这里条件判定为 true
|| ! config('admin.permission.enable')
|| $this->shouldPassThrough($request)
|| $user->isAdministrator()
|| $this->checkRoutePermission($request)
) {
// ⚠️ 会走到这里,直接跳过了权限检查…
return $next($request);
}
if (! $user->allPermissions()->first(function ($permission) use ($request) {
return $permission->shouldPassThrough($request);
})) {
Checker::error();
}
return $next($request);
}
🙏 不知是不是我哪里理解错了…
方案2确实有问题
然后我只能想办法绕回用 方案 1,但是代码我理解错了,用了 controller.action 这种形式… 还是不行。😔