Создаете промежуточные таблицы
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);
}