与laravel 5的角色,如何只允许管理员访问某些root

Vla*_*kic 7 php laravel-5

我按照本教程:https://www.youtube.com/watch?v = kmJYVhG6UzM目前我可以检查我的刀片,如果用户是管理员或不是这样的:

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

如何才能让我的路由仅供管理员用户使用?

Chr*_*end 14

您需要为您的路线创建中间件.

使用:php artisan make:middleware AdminMiddleware.

您将在中间件文件夹中找到具有此名称的新文件.

将您的逻辑放在中间件中,例如

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

}
Run Code Online (Sandbox Code Playgroud)

在中间件中完成逻辑后,可以在路由中调用它,也可以将中间件应用于所有路由.

如果要将其添加到所有路由,请转到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',
];
Run Code Online (Sandbox Code Playgroud)

如果只想将其添加到特定路由,请将其添加到$routeMiddleware变量并将别名添加到路径.例如

protected $routeMiddleware = [
    'auth' => 'App\Http\Middleware\Authenticate',
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
    'admin' => 'App\Http\Middleware\AdminMiddleware',
];
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其添加到路径中,例如过滤器

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

}]);
Run Code Online (Sandbox Code Playgroud)

有关其他信息,请访问以下文档:

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');

    }
}
Run Code Online (Sandbox Code Playgroud)

注意...... $ allowed_roles

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

}]);
Run Code Online (Sandbox Code Playgroud)

您现在可以指定一个中间件所需的角色,而不是使用中间件参数创建多个角色

文档 https://laravel.com/docs/5.3/middleware#middleware-parameters