Laravel Gate: авторизация не работает

Я пытаюсь сделать базовую авторизацию 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

поставщик услуг авторизации

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;

}

Это не работает должным образом, означает, что я не могу получить доступ к маршруту, хотя он есть в таблице разрешений с соответствующим пользователем.


person Hola    schedule 08.02.2017    source источник
comment
Там есть незакомментированный dd()... Кроме того, это несколько неэффективно. Вы можете запросить только разрешения пользователя, а не все разрешения в вашей системе.   -  person Stuart Wagner    schedule 08.02.2017
comment
Удалите dd($permission) из своего вопроса за ненадобностью.   -  person Onix    schedule 08.02.2017
comment
Я удалил его, хотя ... я думаю, что есть проблема с запросом пользователя и ролей ...   -  person Hola    schedule 08.02.2017
comment
на самом деле ты не сделал   -  person Onix    schedule 08.02.2017
comment
Хорошо, я обновил .. Теперь проверьте, пожалуйста   -  person Hola    schedule 08.02.2017


Ответы (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();
}

Надеюсь, это сработает для вашей цели.

person Mahbub    schedule 08.02.2017
comment
Я получил следующую ошибку ›› Call to a member function intersect() on null Последняя строка вашего кода.. - person Hola; 09.02.2017
comment
проверка $role равна нулю. $role должен быть сборником. if($role===null) { return false;} return (bool) $role->intersect($this->roles)->count(); - person Mahbub; 09.02.2017
comment
Тогда я не могу получить доступ к маршруту. Означает, что у роли есть разрешение в таблице role_permission. Но я не могу получить доступ к маршруту. - person Hola; 09.02.2017