Роли с 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.