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 路由不起作用,但其他路由不起作用

laravel 项目在“http://localhost/public/”中不起作用,页面显示“此页面不起作用”

为啥 Laravel 4 CSRF 令牌不起作用?