Урок 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты