Распределение ролей в Laravel 5.2

  1. Миграции
  2. Модели
  3. Функции для работы с ролями

Распределение прав пользователей:

Права в laravel 5. Часть 1

Права в laravel 5. Часть 2

 

Миграция.

php artisan make:migration create_roles_table --create=roles

В таблице roles будут следующие поля:

id,name, created_at, update_at.

По желанию можно добавить еще поля. Например, display_name — отображаемое имя.

 

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateRolesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');

            $table->timestamps();
        });

        Schema::create('users_roles', function (Blueprint $table) {
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');


            $table->integer('role_id')->unsigned();
            $table->foreign('role_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('roles');
        Schema::dropIfExists('users_roles');
    }
}

 

Запускаем миграцию.

php artisan migrate

 

Модели.

php artisan make:model Models\Role

 

Так как мои модели хранятся в папке Models команда выглядит именно так.

Содержимое модели Role

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    /**
     * Пользователи, которые принадлежат данной роли.
     */
    public function users()
    {
        return $this->belongsToMany('App\Models\User', 'users_roles', 'user_id', 'role_id');
    }
}

 

Модель User

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    /****/

    /**
     * Функция для получение название роли к которой пользователь принадлежит.
     *
     * @return boolean
     **/

    public function roles()
    {
        return $this->belongsToMany('App\Models\Role', 'users_roles', 'user_id', 'role_id');
    }

    /**
     * Проверка принадлежит ли пользователь к какой либо роли
     *
     * @return boolean
     */

    public function isEmployee()
    {
        $roles = $this->roles->toArray();
        return !empty($roles);
    }

    /**
     * Проверка имеет ли пользователь определенную роль
     *
     * @return boolean
     */

    public function hasRole($check)
    {
        return in_array($check, array_pluck($this->roles->toArray(), 'name'));
        // начиная с версии 5.1 метода array_fetch не существует
        //return in_array($check, array_fetch($this->roles->toArray(), 'name'));
}

    /**
     * Получение идентификатора роли
     *
     * @return int
     */
    private function getIdInArray($array, $term)
    {
        foreach ($array as $key => $value) {
            if ($value == $term) {
                return $key + 1;
            }
        }
        return false;
    }

    /**
     * Добавление роли пользователю
     *
     * @return boolean
     */
    public function makeEmployee($title)
    {
        $assigned_roles = array();

        $roles = array_fetch(Role::all()->toArray(), 'name');

        switch ($title) {
            case 'super_admin':
            $assigned_roles[] = $this->getIdInArray($roles, 'super_admin');
            case 'admin':
            $assigned_roles[] = $this->getIdInArray($roles, 'admin');
            case 'teacher':
            $assigned_roles[] = $this->getIdInArray($roles, 'teacher');
            case 'student':
            $assigned_roles[] = $this->getIdInArray($roles, 'student');
            case 'login':
            $assigned_roles[] = $this->getIdInArray($roles, 'login');
            break;
            default:
            $assigned_roles[] = false;
        }
        $this->roles()->attach($assigned_roles);
    }
    /****/

}

 

 

Для использования в роуторе нужно создать посредника.

Middleware.

Выполняем команду.

php artisan make:middleware OwnerMiddleware

Код в посреднике:

<?php

namespace App\Http\Middleware;

use Closure;

class OwnerMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @param  string $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {

        if (!$request->user()->hasRole($role)) {
            return redirect('/'); // редирект куда угодно
        }
        return $next($request);
    }
}

Далее нужно войти в Kernel.php и добавить в массив routeMiddleware

'role' => \App\Http\Middleware\OwnerMiddleware::class,

Вызов в роуторе:

Route::get('/home', ['as' => 'home', 'middleware' => 'role:admin', 'uses' => 'HomeController@index']);

 

role:admin — тут любая роль

Примеры использования:

$user = \Auth::user();
//    $user->makeEmployee('login');    // присвоить роль login
//    $user->hasRole('login');    // return true or false
//    $user->isEmployee();    // return true or false

Если нам нужно запретить какой-то блок в шаблоне можно написать так:

@if(\Auth::user()->hasRole('admin'))
/****/
@endif