Разные пользователи, промежуточное ПО Laravel 5

Я пытаюсь использовать разные уровни пользователей в своей системе. У меня есть в базе данных мои пользователи и их уровни (мастер, порт, чавес и т. д.)

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

Я могу легко проверить на каждой странице системы его AUTH и не показывать ему страницу, если он вошел в учетную запись ведьмы, он не должен видеть эту страницу. НО, есть простой способ сделать это с промежуточным ПО/маршрутами нет?!

Я пробовал что-то подобное на своих маршрутах.php:

Route::group(['middleware' => 'Master'], function()
{
    Route::any('/vendedor/produtos/removeProduto', 'AjaxController@vendedorRemoveProduto');
    Route::any('/vendedor/produtos/editaPrecoProduto', 'AjaxController@editaPrecoProduto');
    Route::any('/vendedor/produtos/alterarestadoproduto', 'AjaxController@alterarestadoumproduto');
    Route::any('/vendedor/produtos/listaProdutos', 'AjaxController@listaProdutos');
    Route::any('/vendedor/produtos/adicionaProdutoCliente', 'AjaxController@adicionaProdutoCliente');
    Route::any('/', 'DashboardController@home'); });

    Route::group(['middleware' => 'portais'], function()
{
    Route::any('/cadastrarobjedu/criartema', 'AjaxController@criartemaobjedu');
    Route::any('/cadastrarobjedu/cadastrar', 'AjaxController@cadastraobjedu');
    Route::any('/cadastrarobjedu', 'DashboardController@cadastrarobjedu');
    Route::any('/listarobjedu', 'DashboardController@listarobjedu');
    Route::any('/editarobjeto/{id}', 'DashboardController@editarobjeto');
    Route::any('/apagarobjeto/{id}', 'AjaxController@apagarobjeto');
    Route::any('/', 'DashboardController@home'); });

Но это не сработало, выдало мне ошибку о том, что класс "MASTER" не существует. Я изменил что-нибудь еще?


person André Rodrigues    schedule 17.07.2015    source источник
comment
Реализовали ли вы Мастер-класс? Если нет, то не удивительно, что его нет :)   -  person jedrzej.kurylo    schedule 17.07.2015
comment
Какую версию lf Laravel вы используете? 5.0 или 5.1?   -  person jedrzej.kurylo    schedule 17.07.2015
comment
5.0 ребята. Нет, на самом деле я немного потерялся в том, как и где реализовать класс. Есть в той же папке Authentication.php? APP-›Http-›контроллеры-›Middleware Есть?   -  person André Rodrigues    schedule 17.07.2015


Ответы (1)


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

Ларавел 5.0

//app/Http/Kernel.php - register middleware classes
protected $routeMiddleware = [
    'levelMaster'  => 'App\Http\Middleware\LevelMasterMiddleware',
    'levelPortais' => 'App\Http\Middleware\LevelPortaisMiddleware'
];

//app/Http/Middleware/LevelMiddleware.php - base middleware class that checks if user has level stored in $level;
namespace App\Http\Middleware;

use Closure;
use App;
use Auth;

abstract class LevelMiddleware
{   
    protected $level;

    public function handle($request, Closure $next)
    {
        if (Auth::user() && Auth::user()->level !== $this->level) {
            return App::abort(Auth::check() ? 403 : 401, Auth::check() ? 'Forbidden' : 'Unauthorized');
        }

        return $next($request);
    }
}

//app/Kernel/Middleware/LevelMasterMiddleware.php - checks if user has level Master
namespace App\Http\Middleware;

class LevelMasterMiddleware extends LevelMiddleware
{   
    protected $level = 'master';
}

//app/Kernel/Middleware/LevelPortaisMiddleware.php - checks if user has level Portais
namespace App\Http\Middleware;

class LevelPortaisMiddleware extends LevelMiddleware
{   
    protected $level = 'portais';
}

//config/routes.php - configure routes for different levels
Route::group(['middleware' => 'levelMaster'], function()    
{
    //here add routes for users with level=master
}

Route::group(['middleware' => 'levelPortais'], function()    
{
    //here add routes for users with level=portais
}

Ларавел 5.1

В последней версии Laravel представлены параметры промежуточного программного обеспечения, которые позволяют немного упростить приведенный выше код, поскольку потребуется только один класс промежуточного программного обеспечения:

//app/Http/Kernel.php - register middleware class
protected $routeMiddleware = ['level' => 'App\Http\Middleware\LevelMiddleware'];

//app/Http/Middleware/LevelMiddleware.php - check if current user has given level
namespace App\Http\Middleware;

use Closure;
use App;
use Auth;

class LevelMiddleware
{    
    public function handle($request, Closure $next, $level)
    {
        if (Auth::user() && Auth::user()->level !== $level) {
            return App::abort(Auth::check() ? 403 : 401, Auth::check() ? 'Forbidden' : 'Unauthorized');
        }

        return $next($request);
    }
}

//config/routes.php - configure routes for different levels and pass level as middleware parameter
Route::group(['middleware' => 'level:master'], function()    
{
    //here add routes for users with level=master
}

Route::group(['middleware' => 'level:portais'], function()    
{
    //here add routes for users with level=portais
}
person jedrzej.kurylo    schedule 17.07.2015
comment
Tnx чувак, сейчас попробую. :D - person André Rodrigues; 17.07.2015
comment
У меня здесь нет LevelMiddleware.php... Нужно правильно его создать? Извините, но я действительно новичок в laravel: D - person André Rodrigues; 17.07.2015
comment
ХАХАХХА теперь я понимаю, я должен создать каждый из level.php правильно? - person André Rodrigues; 17.07.2015
comment
Да, вам нужно добавить классы промежуточного программного обеспечения - person jedrzej.kurylo; 17.07.2015
comment
Итак, я создам 4 новых PHP-файла: LevelMasterMiddleware.php LevelChavesMiddleware.php LevelObjetosMiddleware.php LevelPortaisMiddleware.php И я изменю имя абстрактного класса в каждом, верно? - person André Rodrigues; 17.07.2015
comment
Вы устанавливаете переменную $level на любой уровень, который хотите проверить. Все эти классы должны расширять базовое ПО LevelMiddleware, содержащее логику - person jedrzej.kurylo; 17.07.2015
comment
Хорошо, почти работает, мне запрещают любой вход в систему: в Application.php строка 880 в Application-›abort('403', 'Forbidden') в Facade.php строка 213 в Facade::__callStatic('abort', array('403', 'Forbidden')) в строке 14 LevelMiddleware.php в App::abort('403', 'Forbidden') в строке 14 LevelMiddleware.php - person André Rodrigues; 17.07.2015
comment
а также...? Вы хотели получить 403, если у пользователей нет должного уровня. - person jedrzej.kurylo; 17.07.2015
comment
Да, но я захожу под учетной записью нужного уровня :D на самом деле я пробовал с учетными записями каждого уровня, ничего не работает :( - person André Rodrigues; 17.07.2015
comment
Если что-то еще должно произойти, если у пользователя нет надлежащего уровня, вам нужно будет заменить часть App::abort какой-либо другой логикой. - person jedrzej.kurylo; 17.07.2015
comment
Сделайте dd(Auth::user()-›level); (или что вы используете для хранения пользовательского уровня) в начале функции дескриптора в промежуточном программном обеспечении и вставьте вывод - person jedrzej.kurylo; 17.07.2015
comment
Эта часть: protected $routeMiddleware = [ 'levelMaster' =› 'App\Http\Middleware\LevelMasterMiddleware', 'levelPortais' =› 'App\Http\Middleware\LevelPortaisMiddleware' ]; не следует использовать master, portais вместо levelMaster...? - person André Rodrigues; 17.07.2015
comment
Дело в следующем: dd(Auth::user()-›level); = 'chaves' dd($this-›level) = portais, поэтому они разные, поэтому я получил 403... - person André Rodrigues; 17.07.2015
comment
Это означает, что вы открыли маршрут для уровневых портов с пользователем, у которого есть уровневые ворота, верно? Вот почему промежуточное ПО возвращает 403. Разве это не то, что вам нужно? Может быть, я неправильно понял ваши намерения - person jedrzej.kurylo; 17.07.2015
comment
Нет, мне нужно следующее: у masters будет X маршрутов (все страницы), у portais будет Y маршрутов (некоторые страницы только для тех, кто вошел в систему с уровнем portais), у Chaves будет Z маршрутов и т. д. и т. д. - person André Rodrigues; 17.07.2015
comment
Затем реализуйте эту логику и ролевую иерархию в промежуточном программном обеспечении. - person jedrzej.kurylo; 17.07.2015
comment
Я сделал, но я не нашел, где я делаю что-то не так. По мне так все нормально. (извините, что слишком долго отвечаю) - person André Rodrigues; 20.07.2015
comment
Да, я положу это на свой диск, второй, пожалуйста. - person André Rodrigues; 20.07.2015