Роли с laravel 5, как разрешить только администратору доступ к некоторому корню

Я следую этому руководству:https://www.youtube.com/watch?v=kmJYVhG6UzM В настоящее время я могу проверить свой клинок, если пользователь является администратором или не так:

{{ Auth::user()->roles->toArray()[0]['role'] }}
HI ADMIN
@endif

Как сделать мой маршрут доступным только для администратора?

3 ответов


вам нужно создать промежуточное ПО для вашего маршрута.

использование: php artisan make:middleware AdminMiddleware.

в папке middleware вы найдете новый файл с этим именем.

поместите свою логику в промежуточное ПО, например

public function handle($request, Closure $next)
{
    if(Auth::check())
    {
        return $next($request);
    }
    else
    {
        return view('auth.login')->withErrors('You are not logged in');
    }

}

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

если вы хотите добавить его ко всем маршрутам, перейдите в Kernel.php и добавьте его в $middleware такими, например,

protected $middleware = [
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',
    'App\Http\Middleware\VerifyCsrfToken',
    'App\Http\Middleware\AdminMiddleware',
];

если вы хотите добавить его только к определенным маршрутам, добавьте его в $routeMiddleware переменная и добавьте псевдоним к маршруту. Е. Г.

protected $routeMiddleware = [
    'auth' => 'App\Http\Middleware\Authenticate',
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
    'admin' => 'App\Http\Middleware\AdminMiddleware',
];

затем вы можете добавить ее в маршрут, в качестве фильтра, например,

Route::get('admin/profile', ['middleware' => 'admin', function()
{

}]);

для получения дополнительной информации посетите документы:

http://laravel.com/docs/master/middleware

редактировать

улучшением этого было бы использование вариационных функций который был представлен в PHP 5.6

http://php.net/manual/en/migration56.new-features.php

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

PermissionMiddleware

namespace App\Http\Middleware;

use Closure;
use \App\Models\Role;
class PermissionMiddleware
{
    // Pass parameters to this middleware
    public function handle($request, Closure $next, ...$permitted_roles)
    {

        //Get a users role
        $role = new Role;
        $role_name = $role->getUserRoleByName();
        foreach($permitted_roles as $permitted_role) {
            if($permitted_role == $role_name) {
                return $next($request);
            }
        }
        return redirect()->back()->withErrors('You do not have the required permission');

    }
}

заметить ...$permitted_roles

Route::get('admin/profile', ['middleware' => 'PermissionMiddleware:Admin,Marketing', function()
{

}]);

теперь вы можете указать столько ролей, сколько требуется для одного промежуточного ПО, а не создавать несколько с помощью промежуточного ПО параметры

документы https://laravel.com/docs/5.3/middleware#middleware-parameters


предположим, у вас есть столбец в таблице пользователей с isAdmin имя, которое имеет значение по умолчанию 0 (false)

вы можете дать специальный доступ с помощью промежуточного программного обеспечения в laravel, как вы даете доступ к зарегистрированным пользователям с помощью auth промежуточное ПО в laravel. Теперь вам нужно создать промежуточное ПО с помощью команды:

php artisan make:middleware AdminMiddleware

в вашем ядре.php вам нужно добавить эту строку в protected $routeMiddleware

'admin' => \App\Http\Middleware\AdminMiddleware::class,

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

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

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

        if(Auth::user()->isAdmin == '1') // is an admin
        {
            return $next($request); // pass the admin
        }

        return redirect('/'); // not admin. redirect whereever you like

    }
}

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

Route::get('/iamanadmin', ['middleware' => 'admin', function() {
    return view('iamanadmin');
}]);

используйте промежуточное ПО и проверьте пользователя admin.

Route::get('admin', ['middleware' => 'checkadmin', function()
{

}]);

Теперь создайте промежуточное ПО и проверьте пользователя admin.