适用于多个角色的Laravel 5.2 Controller中间件

时间:2016-06-03 18:02:27

标签: php laravel-5.2 roles middleware

我的laravel应用程序中有角色管理员,主持人和成员。应用程序有前端和后端部分。我想仅允许管理员和主持人访问后端部分。我创建了SuperUsersMiddleware:

<?php

namespace CMS\Http\Middleware;

use Closure;

class SuperUsersMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (! $request->user()->hasRole('administrator') || ! $request->user()->hasRole('moderator')) {
            return redirect('/');
        }
        return $next($request);
    }
}

在Kernel.php中注册:

......
    protected $routeMiddleware = [
        'superusers' => \CMS\Http\Middleware\SuperUsersMiddleware::class,
        'administrator' => \CMS\Http\Middleware\AdminMiddleware::class,
        'moderator' => \CMS\Http\Middleware\ModeratorMiddleware::class,
        'auth' => \CMS\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \CMS\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
.....

在我的后端文件夹中我创建了Controller.php(后端部分中的所有其他控制器都扩展了这个控制器)并在__construct()函数中设置了中间件:

...
public function __construct()
    {
        $this->middleware('superusers');
    }
...

但这对我不起作用。我还创建了管理员和主持人中间件,它分开工作,但我需要两个 - 一起。怎么做?托盘:

public function __construct()
{
     $this->middleware('administrator');
     $this->middleware('moderator');
}

但这也行不通。这种情况的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

首先,我不会在您的主人Controller上应用任何中间件,因为中间件将应用于所有内容。您应该在UserController等每个控制器上执行此操作。

您可以根据需要将任意数量的中间件实例应用于路由/功能。我不知道有任何限制。所以我不确定你为什么说这不起作用:

public function __construct()
{
     $this->middleware('administrator');
     $this->middleware('moderator');
}

您可以将不同的中间件应用于需要不同级别的路由。您可以在routes.php或控制器中执行此操作。如果您想在控制器中执行此操作,就像您在上面所做的那样,您可能会遇到以下情况:

public function __construct()
{
    $this->middleware('auth'); //this applies to all actions
    $this->middleware('administrator', ['only' => ['adminFunction', 'otherAdminFunction','bothCanAccess']]);
    $this->middleware('moderator',['only' => ['moderatorFunction','bothCanAccess']);
}

public function adminfunction()
{
    ...
}

public function otherAdminfunction()
{
    ...
}

public function moderatorFunction()
{
    ...
}

public function bothCanAccess()
{
    ...
}

首先,auth中间件将适用于所有操作。这意味着用户必须登录才能访问此处的任何功能。然后,您可以将特定的中间件应用于每个功能。如果您需要更多信息,请查看文档:

https://laravel.com/docs/5.2/controllers#controller-middleware

要在路由器中执行此操作,您可以执行以下操作:

Route::get('/admin', ['middleware' => ['auth', 'administrator'],'uses'=>'Controller@adminFunction']);

因此,在这种情况下,它将首先应用auth中间件以确保有人登录,然后触发administrator中间件并确保用户是管理员。

希望这有帮助。