2016-11-17 36 views
6

Khi tôi muốn chia sẻ url trang từ trang web của mình như mysite.com/page1#foo=bar hoặc muốn truy cập trang này khi tôi đăng xuất, tôi được chuyển hướng đến biểu mẫu login dưới dạng page1 tuyến đường nằm trong auth middleware.laravel - chuyển hướng đăng nhập mất hàm băm url

Vấn đề của tôi là sau khi đăng nhập thành công, tôi được chuyển hướng đến mysite.com/page1 và tôi mất giá trị băm.

(giá trị băm cũng không được lưu giữ trên /login)

Có cách nào dễ dàng được cung cấp bởi Laravel để giữ băm? Khi băm không được gửi đến máy chủ, tôi nghi ngờ nó, nhưng có lẽ có cái gì đó tôi bị mất một nơi nào đó!

Nếu không tôi sẽ cần phải ghi đè lên đăng nhập, có thể đọc băm với JS và bằng cách nào đó lại tiêm nó trong chuyển hướng sau khi đăng nhập, nhưng sẽ khá thích để tránh làm điều đó nếu có một cách dễ dàng :)

+2

Vâng tôi vừa định nói điều đó e '# fragment' không được gửi đến máy chủ. Vì phần mềm trung gian khởi động và chuyển hướng bạn trước khi bạn có thể thực thi bất kỳ mã phía máy khách nào, tôi không chắc bạn sẽ làm thế nào để thực hiện nó. Cách để có được xung quanh nó, tôi nghĩ rằng sẽ là để loại bỏ các middleware và sử dụng JS để vượt qua các mảnh để máy chủ khi bạn phát hiện ra rằng bạn cần phải chuyển hướng. – Jonathon

+1

Ngoài ra, bạn có thể thay đổi phần mềm trung gian 'auth' để nó không chuyển hướng, và thay vào đó trả về một khung nhìn, trong đó bạn có thể thêm mã phía máy khách, bảo toàn đoạn và sau đó thực hiện chuyển hướng bằng JS. – Jonathon

+0

nghe như một cách tiếp cận tốt! Tôi sẽ điều tra và cố gắng tìm cách để làm điều đó! Nếu tôi có thể truy cập vào '/ login # foo = bar', tôi nên làm tốt! – mokk

Trả lời

1

Nhờ hướng Mruf, tôi quản lý để có được đến cuối này. Không chắc đó là cách triển khai tốt nhất, nhưng có vẻ như nó đang hoạt động.

Về cơ bản, tôi chèn giá trị băm theo hình thức như Mruf đề nghị, và sau đó mở rộng các chức năng trong 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

Một JavaScript đơn giản sẽ làm các trick:

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

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

Bây giờ bạn có thể truy cập băm trong đối tượng yêu cầu của bạn

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

Tôi đã nghĩ đến việc làm tương tự, nhưng đó chỉ là 50% của quá trình tôi nghĩ. Giải pháp của bạn sẽ ngụ ý rằng tôi đang ở trên '/ login # foo = far' mà tôi không có. Một khi tôi đã có mặc dù, giải pháp của bạn nên làm các trick! – mokk

+0

Có vẻ như tôi tự nhầm lẫn khi kiểm tra url khác nhau. Có vẻ như nó thực sự đang chuyển hướng đến '/ login # foo = bar', vì vậy nó giữ băm tôi sẽ có thể kiểm tra giải pháp của bạn! – mokk

+0

một giải pháp khác sẽ là '$ (cửa sổ) .on ('hashchange', function() {// submit hash with ajax to server});' luôn luôn khi băm được thay đổi bạn gửi nó đến máy chủ và vẫn tồn tại trong phiên. Nó chưa được kiểm tra, nên ... – Mruf

Các vấn đề liên quan