我的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');
}
但这也行不通。这种情况的最佳做法是什么?
答案 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
中间件并确保用户是管理员。
希望这有帮助。