首页 文章

Laravel登录绕过在第一次重定向时清除会话

提问于
浏览
1

这是我的问题 . 当我使用登录表单登录时,我的用户可以在应用程序中导航而不会出现已保存会话的问题 .

我要做的是创建一个不使用凭据登录的不同路径 . 例如,转到 /login_for_mike ,我使用用户名存储会话(绕过任何登录),然后将它们重定向到主页 .

奇怪的是,在重定向上,会话是明确的,并将我踢出应用程序 .

现在,如果我第二次回到 /login_for_mike . 似乎 Session 已经创建,我很好 .

第一次重定向的某些内容并没有延续我的会话,事实上,它会创建一个新会话,然后它会持续存在 .

有没有我缺少的东西,或者当我打开那条开放路线时Laravel第一次跳过的东西?

以下是我们处理登录的方式:

1)用户提交登录表单 . 2)我们通过检查我们的ldap服务器来处理表单 . 如果suucessful,我们存储会话变量user . 然后我们重定向到主页 . 如果未设置会话变量(中间件) - 将用户踢到登录页面 .

其他路径:1)使用不同的路由,我们绕过ldap检查和登录表单 . 2)我们使用与上面相同的代码,但是当我们存储会话时,中间件检查会话并且它是完全清楚的并且将用户踢到登录表单 . 3)现在如果我再次点击此路线,它会检查会话并且用户在那里!他们可以继续

看来,当我点击登录表单时发生了不同的事情,当我绕过表单时就不会发生这种情况 .

这是伪代码:

Routes:

Route::post('ldap', 'LdapController@ldap'); //Form posts here
Route::get('login_for_mike', 'LdapController@bypass_login');

LdapController

function ldap() {
    process_ldap($request->input('email'), $request->input('password')); //Works perfectly
}

function bypass_login() {
    process_ldap('mike@email.com', 0, 1); 
}

function process_ldap($user,$pass,$bypass=false)
{
    if (!$bypass)
    {
       $return = check_with_ldap_if_this_valid($user,$pass);
       if (!$return)
          Redirect::to('/login')->withErrors('Wrong credentials')->send();
    }

    Session::put('user', $user);
    Redirect::to('home-page')->send(); //This works when entering through /login/for/mike but fails on middleware for session check

}

Middleware that fails when entering through /login_for_mike

But works if I try to hit it again after the first fail

public function handle($request, Closure $next)
{
    $user=Session::get('user'); //No session when entering though /login_for_mike

    if(!$user){
         return redirect('login');

    }
    return $next($request);
}

2 回答

  • 1

    正如我们所讨论的那样,理论上你的逻辑是合理的,但你需要确保控制器最终返回一些东西 .

    因此,我会将您的代码重写为:

    protected function ldap() 
    {
        return $this->process_ldap($request->input('email'), $request->input('password'));
    }
    
    protected function bypass_login() 
    {
        return $this->process_ldap('mike@email.com', 0, 1); 
    }
    
    private function process_ldap($user, $pass, $bypass = false)
    {
        if (!$bypass) {
           $return = check_with_ldap_if_this_valid($user,$pass);
           if (!$return) {
              return redirect('/login')->withErrors('Wrong credentials');
           }
        }
    
        Session::put('user', $user);
        return redirect('home-page');
    }
    

    (虽然由于我无法完全重现您的问题,但我无法解释这是如何直接导致您的问题,但是您的逻辑确实有意义,所以如果您按照应该使用的方式调用所有内容,它应该可以工作 . )

  • 1

    这不太可能,但我之前看到过一次很难调试登录问题 . send()方法是刷新输出,这可能告诉浏览器在会话写入文件之前启动另一个连接 . 在编写会话时,会从浏览器发送下一个请求,会话被非正式地反序列化,并且您的会话中根本没有任何内容,完全空白 . 无论您是否返回登录麦克风,下一个请求都应该从初始请求中正确读取会话 .

    在登录页面上测试此var_dump $ _SESSION() .

    要么

    在任何重定向send()之前添加session_write_close() .

相关问题