Laravel Gate:授权不起作用
Posted
技术标签:
【中文标题】Laravel Gate:授权不起作用【英文标题】:Laravel Gate : Authorization doesn't work 【发布时间】:2017-06-25 19:59:37 【问题描述】:我正在尝试使 laravel 基本授权。我正在使用门进行 laravel 授权。
表结构
User Table, Permission Table, Role, role_permission table
user : id, name , password, email
permission : id, name
role:id , name
role_permission: id, role_id, permission_id
authServiceProvider
public function boot(GateContract $gate)
$this->registerPolicies();
foreach($this->getPermissions() as $permission)
$gate->define($permission->name,function($user) use($permission)
return $user->role->id == $permission->role_id;
);
public function getPermissions()
$permissions = \DB::table('role_permission')
->join('permissions', 'permissions.id', '=', 'role_permission.permission_id')
->select('role_permission.*','permissions.*')
->get();
return $permissions;
它不能正常工作意味着我无法访问该路由,尽管它在相应用户的权限表中。
【问题讨论】:
那里有一个未注释的dd()
...而且,这有点低效。您可以只查询用户的权限,而不是系统中的每个权限。
如果不需要,请从您的问题中删除 dd($permission)
。
虽然我删除了它..我认为用户和角色的查询存在问题..
其实你没有
好的,我已经更新了..现在请检查
【参考方案1】:
您不应该从服务提供商访问数据库。始终尽量让您的服务提供商保持简单。请按照以下步骤为您服务。
AuthServiceProvider.class
public function boot(GateContract $gate)
$this->registerPolicies($gate);
$gate->before(function($user, $ability)
return $user->hasPermission($ability);
);
现在在App\User
模型中添加以下方法。
public function hasPermission($name)
$permission = Permission::where('name','=', $name)->first();
if(! $permission)
return false;
return $this->hasRole($permission->roles);
public function hasRole($role)
if (is_string($role))
return $this->roles->contains('name', $role);
return (bool) $role->intersect($this->roles)->count();
希望这将有助于达到您的目的。
【讨论】:
我收到以下错误 >>Call to a member function intersect() on null
代码的最后一行..
检查 $role
是否为空。 $role
应该是收藏。 if($role===null) return false; return (bool) $role->intersect($this->roles)->count();
那我就不能访问路由了..表示角色在role_permission表中有权限..但是我不能访问路由。以上是关于Laravel Gate:授权不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.6 Passport 驱动程序在 socket.io 中不起作用并给出未经授权的异常
Swift 自定义转换不起作用(未调用 UIViewControllerTransitioningDelegate)
Laravel Sanctum Token API 身份验证在 Postman 中不起作用
Laravel Admin 路由不起作用,但其他路由不起作用