【问题标题】:Laravel Gate : Authorization doesn't workLaravel Gate:授权不起作用
【发布时间】: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)
  • 虽然我删除了它..我认为用户和角色的查询存在问题..
  • 其实你没有
  • 好的,我已经更新了..现在请检查

标签: php laravel laravel-5 laravel-authorization


【解决方案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表中有权限..但是我不能访问路由。
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 2020-07-23
  • 1970-01-01
  • 2019-04-04
  • 2012-04-24
  • 2015-08-09
  • 2018-06-15
  • 2013-12-11
相关资源
最近更新 更多