Урок 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 со всеми данными.
Отправку почты реализовать асинхронно (используя очереди), сделать хотя бы частичное покрытие тестами. Важно оформление кода, phpdoc, использование особенностей php7 и возможностей фреймворка.


Если вы смогли воспроизвести все манипуляции в предыдущих уроках, то уже сами сможете без труда запрограммировать эту тестовую задачу. Ну а на следующих уроках мы затронем немного теории и углубимся в изучение особенностей Laravel.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по Laravel, laravel, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Мегафон: как выйти из минуса
Урок 12. Рендеринг диаграмм в приложениях Laravel
Буферизация файлов в Windows