@vlad3144

Как правильно реализовать авторизацию пользователя в Laravel?

Есть таблицы, "usrers", "usres_roles", "users_has_roles".
Я сделал регистрацию пользователя через обычную форму, с добавлением в модели relationship many to many. Чтобы при регистрации пользователя ему автоматически присваивалась роль "user" и заносились данные в таблицу "users_has_roles", в поля user_id и role_id соответственно.
Через обычный Auth::attempt берутся данные только из таблицы "users".
Как мне правильно реализовать, чтобы при авторизации пользователю присваивались его роли?
Например, хотелось бы, чтобы в Auth, хранилось поле "user_role". И уже на сновании данных, содержащихся в этом поле, можно было бы через middleware проверять доступ пользователя к странице.
Если есть готовые материалы по данному вопросу, поделитесь, пожалуйста.
  • Вопрос задан
  • 865 просмотров
Решения вопроса 1
@jazzus
Создаете промежуточные таблицы
user_roles с ключами user_id role_id для связи ролей с юзерами
role_perms с role_id perm_id для связи ролей с правилами

Отношение в user на role
public function roles() {
  return $this->belongsToMany('App\Models\Role', 'user_roles', 'user_id', 'role_id')
                ->withPivot('active');
}

В role на perm
public function perms() {
 return $this->belongsToMany('App\Models\Perm', 'role_perms', 'role_id', 'perm_id');
}

Добавляете необходимые правила в perm (таблица id name) типа
CREATE_PROJECT
Разрешение для создания проектов.

Пишете проверку правил в модели user. Метод перебирает роли и правила ролей. Если находит передаваемое из провайдера правило, возвращает тру.
public function hasPerm($perm_id) {
      foreach ($this->roles as $role) {
        foreach ($role->perms as $perm) {
          if ($perm_id==$perm->id) {
            return true; }}}
    }

Добавляете в AuthServiceProvider.php в boot. Проверка делается по названию правила (напр. CREATE_PROJECT). Поиск по id в методе hasPerm
$perms = Perm::get();
foreach ($perms as $perm) {
   Gate::define($perm->name, function($user) use($perm) {
   return $user->hasPerm($perm->id);
   });
}

Заранее связываете правила и роли через attach
При регистрации (или в другой момент например руками в админке) через attach назначаете роль юзеру.

В итоге.
В blade шаблонах можете ограничивать доступ к любым элементам через директиву can
@can ('CREATE_PROJECT')
<input type="button" value="Создать проект">
@endcan

В контроллерах доступ к методам через Gate
public function store (ProjectRequest $request) {
    //доступ к методу
    if (Gate::denies('CREATE_PROJECT')) {
           abort(404);
     }
}

Создаете Middleware для ограничения доступа к роутам. Там проверка
if($user->hasRole($roleId)){
   return $next($request);
}
return redirect('/');

Если у юзера есть роль то пускает дальше, если нет то редирект на главную. Метод hasRole возвращает true/false в user, проверяя есть ли у юзера роль.
public function hasRole($id) {
    return $this->roles->contains('id',$id);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы