Php 设置多个身份验证保护时发生Laravel重定向错误
我已经按照本教程中所述设置了管理员身份验证保护:Php 设置多个身份验证保护时发生Laravel重定向错误,php,laravel,authentication,routes,Php,Laravel,Authentication,Routes,我已经按照本教程中所述设置了管理员身份验证保护: 路线 Route::group([ 'prefix' => 'admin', 'namespace' => 'Auth' ], function() { Route::get('/login', 'AdminController@showLogin')->name('admin.show.login'); Route::post('/login', 'AdminController@login
路线
Route::group([
'prefix' => 'admin',
'namespace' => 'Auth'
], function() {
Route::get('/login', 'AdminController@showLogin')->name('admin.show.login');
Route::post('/login', 'AdminController@login')->name('admin.login');
Route::group([
'middleware' => 'auth:admin'
], function() {
Route::get('/', 'AdminController@index')->name('admin.home');
Route::get('/logout', 'AdminController@logout');
});
});
控制器
class AdminController extends Controller
{
public function __construct()
{
$this->middleware('guest:admin')->except('logout');
}
public function index()
{
return "Admin authenticated";
}
public function showLogin()
{
return view('admin.login');
}
public function login(Request $request)
{
$admin = Admin::where('login_id', $request->input('login'))->firstOrFail();
Auth::guard('admin')->loginUsingId($admin->id, TRUE);
return redirect()->intended(route('admin.home'));
}
public function logout()
{
Auth::guard('admin')->logout();
return redirect()->route('admin.show.login');
}
}
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson())
{
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guard = array_get($exception->guards(), 0);
switch ($guard)
{
case 'admin':
$login = 'admin.show.login';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(route($login));
}
重定向身份验证
中间件
public function handle($request, Closure $next, $guard = null)
{
switch ($guard)
{
case 'admin':
if (Auth::guard($guard)->check())
{
return redirect()->route('admin.home');
}
break;
default:
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
break;
}
return $next($request);
}
异常处理程序
class AdminController extends Controller
{
public function __construct()
{
$this->middleware('guest:admin')->except('logout');
}
public function index()
{
return "Admin authenticated";
}
public function showLogin()
{
return view('admin.login');
}
public function login(Request $request)
{
$admin = Admin::where('login_id', $request->input('login'))->firstOrFail();
Auth::guard('admin')->loginUsingId($admin->id, TRUE);
return redirect()->intended(route('admin.home'));
}
public function logout()
{
Auth::guard('admin')->logout();
return redirect()->route('admin.show.login');
}
}
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson())
{
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guard = array_get($exception->guards(), 0);
switch ($guard)
{
case 'admin':
$login = 'admin.show.login';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(route($login));
}
如果在未登录的情况下访问
/admin
,则/admin/login
视图将正确显示。登录后,/admin
URL导致无限重定向循环错误。管理员可以使用/admin/logout
路径成功注销。问题似乎是重定向验证的中间件的原因。我遗漏了什么吗?似乎您的问题发生在AdminController
中,特别是构造函数中
重定向循环发生在路由/admin
上,因为中间件与auth:admin
中间件(在路由中)和guest:admin
中间件(在控制器中)冲突
您需要将guest:admin
中间件应用于除索引
和注销
功能以外的所有功能:
$this->middleware('guest:admin', ['except' => ['index', 'logout']]);
我像下面的$this->middleware('auth:admin',['except'=>['index','logout']])一样应用了它代码>因为用户有默认的用户身份验证保护。但是,重定向循环错误发生在/admin/login
上,并且/admin
已为所有访问打开。@M.Ko,对不起,我的错,中间件应该是来宾:admin
。我已经更新了我的答案。如果经过验证的是路径guest
中间件不是全局的,请检查app/HTTP/Kernel.php
。同时看看你链接的教程底部的评论。你的评论启发了我。千万不要注意到RedirectIfAuthenticated
中间件是通过guest
关键字映射的。是的,这是一个常见的错误概念,它实际上是在做什么。RedirectIfAuthenticated,这个名称是误导性的。