当我使用锁屏特征时,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()-&gt;route('login.locked'); 将您发送到路由 login.locked,该路由将您发送回 loginController 中的 locked() 函数,该函数将您重定向回 /。尝试使用另一个 URL(例如 /home)而不是 /,看看会发生什么。 我尝试了许多解决方案,但所有路线仍然是同一个问题我尝试过dd() 尝试过about(404) 我只是想跟踪路线修复 ERR 的唯一一件事就是删除return redirect()-&gt;route('login.locked');if ($lockExpiresAt &lt; 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 重定向太多次的主要内容,如果未能解决你的问题,请参考以下文章

使用Laravel 5.7中的Auth激活用户会话时重定向到页面的方法

登录laravel 5.7后重定向到上一页

当我尝试访问主页时,Laravel 不会重定向到登录页面

重定向到资源路由时路由不存在[Laravel]

在 Laravel POST 请求上重定向 302

Laravel 在身份验证异常时自动重定向