Я пытаюсь использовать некоторые методы одного и того же контроллера с различными промежуточными программами, например, позволить администратору и пользователю использовать методы index и создавать в одном контроллере. Таким образом, я сделал админа охранять пользователя.
Это мой AdminMidleware
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class AdminMidleware
{
public function handle($request, Closure $next)
{
if (Auth::guard('admin')->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/');
}
}
return $next($request);
}
}
My UserMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class UserMiddleware
{
public function handle($request, Closure $next)
{
if (Auth::guard('user')->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/');
}
}
return $next($request);
}
}
Они оба находятся в kernel.php в $ routeMiddleware
'admin' => \App\Http\Middleware\AdminMidleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,
Если я использую это, я могу сделать так, чтобы только администратор получил доступ к методам, и это работает, вы должны войти в систему как и администратор, чтобы использовать методы.
public function __construct(){
$this->middleware('admin', ['only' => [
'index',
'create',
]]);
}
И это предполагает, что пользователь и администратор могут использовать индекс и создавать методы в одном контроллере, отправляя в качестве первого параметра массив с промежуточным программным обеспечением администратора и пользователя,
public function __construct(){
$this->middleware(['admin', 'user'], ['only' => [
'index',
'create',
]]);
}
Но это не работает, на самом деле никто не может использовать методы. Не могли бы вы помочь мне сделать эту работу нормально? Что я делаю неправильно?
Поскольку ваше промежуточное программное обеспечение идентично, за исключением guard
б, вы можете попытаться сделать auth
промежуточное ПО, которое имитирует auth
промежуточное ПО, которое поставляется с более новыми версиями Laravel. Это позволит вам передавать несколько охранников в качестве параметров промежуточному программному обеспечению.
public function handle($request, Closure $next)
{
// get guards or use 'null' (default guard)
$guards = array_slice(func_get_args(), 2) ?: [null];
// spin through guards to find one that checks out
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
// if we have a guard name, not null
if ($guard) {
// use this guard as the default
Auth::shouldUse($guard);
}
// we have an authed user from some guard move along
return $next($request);
}
}
// handle no authed user
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthenticated.', 401);
}
return redirect()->guest('/');
}
Он будет проходить через всех пройденных охранников, и если кто-либо из них разрешит пользователя, этот охранник станет защитником по умолчанию, который Auth
буду использовать.
$this->middleware('thatmiddleware:user,admin');
Нечто подобное должно работать.
Других решений пока нет …