簡體   English   中英

Laravel登錄旁路在第一次重定向時清除了會話

[英]Laravel login bypass clears Session on first redirect

這是我的問題。 當我使用登錄表單登錄時,我的用戶可以在應用程序中導航,而會話保存沒有問題。

我想做的是創建一個沒有憑據即可登錄的不同路徑。 例如,轉到/login_for_mike ,我用用戶名存儲會話(繞過任何登錄名),然后將其重定向到主頁。

奇怪的是,在該重定向上,會話很清晰,使我退出了應用程序。

現在,如果我第二次返回/login_for_mike 會話似乎已創建,我很好。

第一次重定向上的某些內容不會繼續執行我的會話,事實上,它創建了一個新會話,然后該會話繼續存在。

有什么我想念的東西,或者是我在打通那條開放路線時Laravel第一次跳過的東西?

這是我們處理登錄的方式:

1)用戶提交登錄表格。 2)我們通過檢查ldap服務器來處理表格。 如果成功,我們將存儲一個會話變量用戶。 然后我們重定向到主頁。 如果未設置會話變量(中間件),則將用戶踢到登錄頁面。

其他路徑:1)使用其他路由,我們繞過ldap檢查和登錄表單。 2)我們使用與上面相同的代碼,但是,當我們存儲會話時,中間件會檢查該會話,並且它是完全清楚的並踢用戶登錄表單。 3)現在,如果我再次點擊此路由,它將檢查會話,並且用戶在此處! 他們可以繼續。

看來,當我點擊登錄表單時會發生一些不同的事情,而當我繞過表單時卻不會發生。

這是偽代碼:

路線:

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

}

通過/ login_for_mike輸入時失敗的中間件

但是如果我第一次失敗后再次嘗試擊中它會起作用

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);
}

這不太可能,但我之前見過一次很難調試登錄問題。 send()方法正在刷新輸出,這可能會告訴瀏覽器在將會話寫入文件之前啟動另一個連接。 下一個請求是在會話被寫入時從瀏覽器發送的,該會話被不干凈地反序列化,並且您的會話中沒有任何內容,完全空白。 下一個請求應該從初始請求中正確讀取會話,而不管您是否返回模擬登錄。

要在登錄頁面上測試此var_dump $ _SESSION()。

要么

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

正如我們所討論的,理論上您的邏輯是正確的,但是您需要確保控制器最終返回一些東西。

因此,我會將您的代碼重寫為:

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');
}

(盡管由於我無法准確地重現您的問題,所以我無法解釋這是如何直接導致您的問題的,但是您的邏輯還是有道理的,因此,如果您以應使用的方式調用所有內容,它應該可以工作。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM