Laravel Middleware для нескольких ролей [потенциальный дубликат] - PullRequest
0 голосов
/ 03 сентября 2018

В настоящее время у меня есть система, в которой у меня есть две совершенно разные сущности Users и Admins каждая со своей таблицей.

В таблице admins есть поле для access_level, поскольку администраторы могут сами иметь разные уровни доступа с точки зрения того, что они могут видеть и управлять. Например, только администраторы с уровнем доступа администратора могут создавать новых администраторов.

Промежуточное программное обеспечение казалось лучшим выбором для этого.

В моей модели администратора у меня есть следующие методы:

/**
 * Check whether this admin has full admin status
 *
 * @return void
 */
public function getIsAdminAttribute()
{
    return $this->access_level == 'admin' ? true : false;
}

/**
 * Check whether this user has Partial status
 *
 * @return void
 */
public function getIsFullAttribute()
{
    return $this->access_level == 'full' ? true : false;
}

/**
 * Check whether this user has Partial status
 *
 * @return void
 */
public function getIsPartialAttribute()
{
    return $this->access_level == 'partial' ? true : false;
}

/**
 * Check whether this admin has a particular role
 *
 * @param [type] $role
 * @return void
 */
public function getHasRoleAttribute($role)
{
    if($this->access_level == $role){
        return true;
    }

    return false;
}

Так что теперь у меня есть доступ к аксессорам is_admin, is_partial, is_full, чтобы проверить разрешение в данный момент авторизованного администратора. У меня также есть способ проверить, есть ли у администратора роль.

Мое промежуточное программное обеспечение, которое я назвал Role, выглядит так:

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class Role
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $roles)
    {
        if (Auth::guard('admin')->user()) {
            $user = Auth::guard('admin')->user();

            if ($user->is_admin) {
                return $next($request);

                foreach($roles as $role){
                    // Check whether user has a given role
                    if($user->has_role($role)){
                        return $next($request);
                    }
                }
            }
        }

        return response('You do not have permission to perform this action', 401);
    }
}

В routes/web.php Затем я использую это так:

Route::get('/vacancies', 'JobPostController@index')->name('vacancies.index')->middleware('role:partial');

Но когда я назначаю себя частично, я получаю ошибку 401 при посещении маршрута.

Роли находятся в таблице администраторов, поскольку когда-либо будет только 3 роли, и они всегда будут привязаны к администраторам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...