Различни потребители, мидълуер Laravel 5

Опитвам се да използвам различни потребителски нива в моята система. Имам в базата данни своите потребители и техните нива (master, portais, chaves и т.н.)

И така, това, което искам, са различни маршрути за всеки потребител, така че всеки да има достъп само до част от системата.

Мога лесно да проверя във всяка страница на системата неговия AUTH и да не му показвам страницата, ако е влязъл в акаунт, който не трябва да вижда тази страница. НО има лесен начин да го направите с мидълуер / Маршрути не?!

Опитах нещо подобно на моя routes.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'); });

Но това не проработи, hgive ми грешка казвайки, че класът "MASTER" не съществува. Промених ли още нещо?


person André Rodrigues    schedule 17.07.2015    source източник
comment
Приложили ли сте майсторски клас? Ако не, тогава нищо чудно, че не съществува :)   -  person jedrzej.kurylo    schedule 17.07.2015
comment
Каква версия на Laravel използвате? 5.0 или 5.1?   -  person jedrzej.kurylo    schedule 17.07.2015
comment
5.0 момчета. Не, не съм, всъщност съм малко загубен за това как и къде внедрявам класа. В същата папка ли е Authentication.php? APP-›Http-›controllers-›Middleware Има ли?   -  person André Rodrigues    schedule 17.07.2015


Отговори (1)


Трябва да внедрите междинен софтуер, който ще проверява дали текущият потребител е дал ниво.

Laravel 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
}

Laravel 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 пич, сега ще го пробвам. :Д - person André Rodrigues; 17.07.2015
comment
Нямам LevelMiddleware.php тук... Трябва ли да го създам правилно? Съжалявам, но наистина съм нов в laravel :D - person André Rodrigues; 17.07.2015
comment
ХАХАХХА сега разбирам, трябва да създам всеки един от levels.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')) в LevelMiddleware.php ред 14 в App::abort('403', 'Forbidden') в LevelMiddleware.php ред 14 - 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()-›ниво); (или каквото и да използвате за съхраняване на потребителското ниво) в началото на функцията за обработка в междинния софтуер и поставете изхода - person jedrzej.kurylo; 17.07.2015
comment
Тази част: защитено $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
Това означава, че сте отворили маршрут за портаи на ниво с потребител, който има chaves на ниво, нали? Ето защо мидълуерът връща 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