2016-11-17 77 views
6

Kiedy chcę udostępnić URL strony z mojej witryny, np. mysite.com/page1#foo=bar, lub chcesz odwiedzić tę stronę po wylogowaniu, jestem przekierowywany do formularza login jako page1 trasa jest w auth middleware.laravel - zaloguj przekierowanie traci adres URL hasla

Mój problem polega na tym, że po pomyślnym zalogowaniu się zostaje przekierowany do mysite.com/page1 i tracę wartość hash.

(wartość hash nie jest również przechowywane na /login)

Czy jest jakiś prosty sposób dostarczone przez laravel zachować hash? Ponieważ hash nie jest wysyłany na serwer, wątpię w to, ale może jest coś, co gdzieś przeoczyłem!

Inaczej muszę zastąpić logowanie, może odczytać hash z JS i jakoś ponownie wstrzyknąć go do przekierowania po zalogowaniu, ale całkiem do uniknięcia robi, że jeśli istnieje prosty sposób :)

+2

Tak, właśnie miałem powiedzieć, że e '# fragment' nie jest wysyłane do serwera. Ponieważ oprogramowanie pośrednie kopie i przekierowuje, zanim będziesz mógł wykonać dowolny kod po stronie klienta, nie jestem pewien, jak byś to zrobił. Sposób obejścia tego problemu powinien usunąć oprogramowanie pośrednie i użyć JS do przekazania fragmentu na serwer, gdy wykryjesz, że musisz przekierować. – Jonathon

+1

Alternatywnie, możesz ewentualnie zmienić oprogramowanie pośredniczące 'auth', aby nie przekierować, i zamiast tego zwraca widok, w którym możesz następnie dodać kod po stronie klienta, zachować fragment, a następnie wykonać przekierowanie za pomocą JS. – Jonathon

+0

brzmi jak dobre podejście! Zbadam i spróbuję znaleźć sposób na zrobienie tego! Jeśli uda mi się dostać do '/ login # foo = bar' powinienem być gotowy! – mokk

Odpowiedz

1

Dzięki kierunku Mruf, udało mi się dostać na samym dole. Nie jestem pewien, czy jest to najlepsze wdrożenie, ale wygląda na to, że działa.

Zasadniczo wstawić wartość hash w postaci Mruf sugeruje, a następnie rozszerzony w funkcji handleUserWasAuthenticatedAuthController

login.blade.php

<script type="text/javascript" > 
    $(document).ready(function() { 
    $('.urlHash').val(window.location.hash); 
    }); 
</script> 

<form id="login-form" role="form" method="POST" action="{{ url('/login') }}"> 
    <input type="hidden" class="form-control urlHash" name="urlHash" value=""> 
    .... 
</form> 

AuthController.php

protected function handleUserWasAuthenticated(Request $request, $throttles) 
{ 
    if ($throttles) { 
     $this->clearLoginAttempts($request); 
    } 

    if (method_exists($this, 'authenticated')) { 
     return $this->authenticated($request, Auth::guard($this->getGuard())->user()); 
    } 

    // old code: return redirect()->intended($this->redirectPath()); 

    $newRequest = redirect()->intended($this->redirectPath()); 
    $newRequest->setTargetUrl($newRequest->getTargetUrl() . $request->urlHash); 

    return $newRequest; 
} 
2

prosty JavaScript by rade:

$("#login-form").submit(function(){ 
    e.preventDefault(); 
    $(this).append("<input type='hidden' name='hash' value='"+window.location.hash+"'"); 

    $(this).submit(); 
}); 

teraz można uzyskać dostęp do mieszania w ciągu żądanie obiektu

function controllerAction(Request $request){ 
    $hash = $request->get("hash"); 
    // Parse Hash 
    .... 
    // Redirect to somewhere 
    .... 
} 
+0

Myślałem o zrobieniu tego samego, ale to tylko 50% procesu, który myślę. Twoje rozwiązanie sugerowałoby, że jestem na '/ login # foo = far', którego nie mam. Kiedy już tam dotrę, twoje rozwiązanie powinno wystarczyć! – mokk

+0

Wygląda na to, że pomyliłem się, testując inny adres URL. Wygląda na to, że faktycznie przekierowuje na '/ login # foo = bar', więc jeśli zachowuje hasz, powinienem przetestować twoje rozwiązanie! – mokk

+0

innym rozwiązaniem byłoby '$ (window) .on ('hashchange', function() {// prześlij hash z ajax do serwera}); tak zawsze, gdy hash zostanie zmieniony, przesyłasz go na serwer i utrzymuje się w sesja. Jest niesprawdzony, więc ... – Mruf