Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于多个角色的Laravel 5.2控制器中间件_Php_Laravel 5.2_Roles_Middleware - Fatal编程技术网

Php 用于多个角色的Laravel 5.2控制器中间件

Php 用于多个角色的Laravel 5.2控制器中间件,php,laravel-5.2,roles,middleware,Php,Laravel 5.2,Roles,Middleware,在我的laravel应用程序中,我有一个角色管理员、版主和成员。应用程序有前端和后端部分。我想只允许管理员和版主访问后端部分。我创建SuperUsersMiddle软件: <?php namespace CMS\Http\Middleware; use Closure; class SuperUsersMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Ht

在我的laravel应用程序中,我有一个角色管理员、版主和成员。应用程序有前端和后端部分。我想只允许管理员和版主访问后端部分。我创建SuperUsersMiddle软件:

<?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);
    }
}
...
public function __construct()
    {
        $this->middleware('superusers');
    }
...
在我的后端文件夹中,我创建Controller.php(后端部分中的所有其他控制器都扩展了此控制器)和_construct()函数集中间件:

<?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);
    }
}
...
public function __construct()
    {
        $this->middleware('superusers');
    }
...
但这对我不起作用。我还创建了管理员和版主中间件,它可以单独工作,但我需要两者同时工作。怎么做?I托盘:

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

但这也不行。对于这种情况,什么是最佳实践?

首先,我不会在您的主
控制器上应用任何中间件,因为这样中间件将应用于所有事情。您应该在每个单独的控制器上执行此操作,如
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()
{
    ...
}
Route::get('/admin', ['middleware' => ['auth', 'administrator'],'uses'=>'Controller@adminFunction']);
因此,首先,
auth
中间件将应用于所有操作。这意味着用户必须登录才能访问此处的任何功能。然后,您可以将特定的中间件应用于每个函数。如果您需要此方面的更多信息,请查看文档:

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

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()
{
    ...
}
Route::get('/admin', ['middleware' => ['auth', 'administrator'],'uses'=>'Controller@adminFunction']);
因此,在这种情况下,它将首先应用
auth
中间件以确保有人登录,然后启动
administrator
中间件并确保用户是管理员

希望这能有所帮助