Урок 9. Простое ограничение доступа в Laravel
Давайте на этом уроке из серии уроков по Laravel научим наше приложение выдавать разный контент разным пользователям. Не в плане их идентификаторов, а в плане их принадлежности к разным группам и ролям. Сделаем клиентов и менеджеров. Менеджеры смогут просматривать заявки (отправленные письма, как мы делали на прошлом и позапрошлом уроке) всех клиентов, а клиенты – только свои.
Есть разные способы, но мы реализуем один из самых простых. Для начала необходимо немного подкорректировать базу данных. Создадим новую миграцию:
php artisan make:migration AddUserRoleФайл делаем таким:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddUserRole extends Migration { public function up() { Schema::table('users', function (Blueprint $table) { $table->unsignedSmallInteger('role')->after('name'); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('role'); }); } }Переходим в каталог xampp\htdocs\new_project\app\Models, открываем файл User.php и меняем его следующим образом:
<?php namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use HasFactory, Notifiable; const ROLE_USER = 0; const ROLE_ADMIN = 5; public function isAdmin(): bool { return $this->role === self::ROLE_ADMIN; } /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; }Теперь прописываем правило доступа в роутере:
Route::get('/upread', function () { $user = Auth::user(); if ($user){ if(!$user->isAdmin()){ abort(403); } else { return view('upread', ['name' => $user->name]); } } else { return view('login'); } } );Здесь у нас при доступе на страницу upread будет проверяться, админ ли пользователь. Если админ, то разрешаем, если нет – то показываем ошибку 403 – доступ запрещен. Ну и завершающий штрих – перенаправляем в файле HomeController.php в зависимости от того, кто пользователь:
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redirect; public function index() { $user = Auth::user(); if(!$user->isAdmin()){ return Redirect::intended('submit'); } else { return Redirect::intended('upread'); } }Если админ – то на upread с главной, а если нет – то к заявке.
Ну а в конце я поясню, зачем мы все это делали деять уроков: мы просто набрасывали решение для вот такой стандартной задачи, которую требуется решить в качестве тестовой на собеседование backend разработчика Laravel:
Необходимо реализовать форму обратной связи на Laravel:
- Регистрация и авторизация: стандартный модуль auth (но пользователи должны быть с двумя ролями: менеджер и клиент. Клиенты регистрируются самостоятельно, а аккаунт менеджера должен быть создан заранее.
- Залогиненный клиент видит форму обратной связи, а менеджер список заявок. (все страницы и функционал доступны только авторизованным пользователям и только в соответствии с их привилегиями).
- Менеджер может просматривать список заявок и отмечать те, на которые ответил.
- Клиент может оставлять заявку, но не чаще раза в сутки.
- На странице создания заявки: тема и сообщение, файловый инпут кнопка "отправить".
- В момент обработки формы и создания заявки отправлять менеджеру email со всеми данными.
Если вы смогли воспроизвести все манипуляции в предыдущих уроках, то уже сами сможете без труда запрограммировать эту тестовую задачу. Ну а на следующих уроках мы затронем немного теории и углубимся в изучение особенностей Laravel.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.