当我使用锁屏特征时,Laravel 5.7 重定向太多次
Posted
技术标签:
【中文标题】当我使用锁屏特征时,Laravel 5.7 重定向太多次【英文标题】:Laravel 5.7 redirected too many times when i use Lock Screen Traits 【发布时间】:2019-06-07 07:34:02 【问题描述】:我正在尝试构建 Laravel 应用程序,我想添加锁屏功能,我在 google 上搜索了它是如何工作的,
我发现这个美丽而简单的教程GitHub:laravel-auth-lock-screen
但是代码好像有问题,请谁能帮帮我!
错误是 会话超时后,应用程序将我重定向到正确的路由“登录/锁定”,但浏览器显示 localhost 将您重定向了太多次。 'ERR_TOO_MANY_REDIRECTS'
路由\web.php
<?php
Route::get('/', function ()
return view('welcome');
);
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::get('login/locked', 'Auth\LoginController@locked')->middleware('auth')->name('login.locked');
Route::post('login/locked', 'Auth\LoginController@unlock')->name('login.unlock');
登录控制器
class LoginController extends Controller
use AuthenticatesUsers;
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
$this->middleware('guest')->except([
'logout',
'locked',
'unlock'
]);
public function locked()
if(!session('lock-expires-at'))
return redirect('/');
if(session('lock-expires-at') > now())
return redirect('/');
return view('auth.locked');
public function unlock(Request $request)
$check = Hash::check($request->input('password'), $request->user()->password);
if(!$check)
return redirect()->route('login.locked')->withErrors([
'Your password does not match your profile.'
]);
session(['lock-expires-at' => now()->addMinutes($request->user()->getLockoutTime())]);
return redirect('/');
中间件
<?php
namespace App\Http\Middleware;
use Closure;
class AuthLock
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
if(!$request->user())
return $next($request);
// If the user does not have this feature enabled, then just return next.
if (!$request->user()->hasLockoutTime())
// Check if previous session was set, if so, remove it because we don't need it here.
if (session('lock-expires-at'))
session()->forget('lock-expires-at');
return $next($request);
if ($lockExpiresAt = session('lock-expires-at'))
if ($lockExpiresAt < now())
return redirect()->route('login.locked');
session(['lock-expires-at' => now()->addMinutes($request->user()->getLockoutTime())]);
return $next($request);
用户模型
use LockableTrait;
谢谢。
【问题讨论】:
您能告诉我们出了什么问题吗?现在的结果与预期的结果如何? 如果登录的用户在几分钟内不活动,我正在尝试显示锁屏,现在我将超时值设置为 1 分钟以进行检查,但是当我在 1 分钟后等待时,它会将我重定向到“登录/锁定” ' 路由但浏览器显示 'ERR_TOO_MANY_REDIRECTS'。 我认为正在发生的事情:return redirect()->route('login.locked');
将您发送到路由 login.locked
,该路由将您发送回 loginController
中的 locked()
函数,该函数将您重定向回 /
。尝试使用另一个 URL(例如 /home
)而不是 /
,看看会发生什么。
我尝试了许多解决方案,但所有路线仍然是同一个问题我尝试过dd()
尝试过about(404)
我只是想跟踪路线修复 ERR 的唯一一件事就是删除return redirect()->route('login.locked');
在if ($lockExpiresAt < now())
在中间件文件中
【参考方案1】:
您可以通过以下方式解决问题:
将auth.lock
排除在:
protected $middlewareGroups = [
'web'=>...
在 route\web.php 中为除 login\locked 之外的所有路由创建路由组,并将您的 auth.lock
中间件添加到该组:
Route::group(['middleware' => ['auth.lock']], function ()
Route::get('/home', ['uses' => 'HomeController@index', 'as' => 'home']);
...
【讨论】:
@daniel-marschall 此解决方案有效,但仅在页面刷新时重定向。谢谢。【参考方案2】:更新伙计们,我一直在尝试解决这个问题,我发现它多次重定向我,因为我在内核类的 web 组中添加了 AuthLock 中间件
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
'auth.lock'
],
'api' => [
'throttle:60,1',
'bindings',
],
];
现在我搜索了很长时间如何为除login,login.locked and login.unlock
路由之外的所有应用程序应用中间件,请帮助?
【讨论】:
不抱歉,我没有找到任何解决方案 如果您有任何帮助材料,是否有其他方法可以解决此锁屏问题,以便我实施? 如果我们解决了这个问题,那么问题只出在中间件中,然后其他所有代码都可以正常工作。 是的,中间件正在将我重定向到锁定屏幕,并且锁定屏幕正在将我重定向到 url('/') 并且它再次将我重定向到锁定屏幕,因为会话仍然被锁定,看起来像我们丢失了一些东西,我一直在努力修复它,但我失败了。我希望一些完美的开发者尽快看到这个话题以上是关于当我使用锁屏特征时,Laravel 5.7 重定向太多次的主要内容,如果未能解决你的问题,请参考以下文章