На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Урок 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

Читайте также:




Фейковый счетчик на php
Как я разблокировал Fly Ezzy Trendy 2 и общая рекомендация по разблокировке телефонов


© upread.ru 2013-2021
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.