2013-09-27 414 views
7

Tôi đang cố gắng để có được gói sentry thiết lập trong ứng dụng của tôi một cách chính xác.chuyển hướng sentry laravel :: dự định không hoạt động

Tôi có thể đăng nhập người dùng vào và ra và bảo vệ các tuyến đường nhưng tôi dường như không thể nhận được redirect::intended hoạt động bình thường. Sự hiểu biết của tôi là người dùng sẽ được đưa trở lại tuyến đường mà họ đã gọi trước khi được chuyển đến trang đăng nhập. Tại thời điểm này nó chỉ đơn giản là giữ chuyển hướng đến trang mặc định.

Trong routes.php của tôi, tôi đã nhóm sau thành lập:

Route::group(array('before' => 'sentryAuth'), function() {...} 

Trong nhóm này, tôi đã đặt tất cả các tuyến đường được bảo vệ.

Trong filters.php của tôi, tôi có các bộ lọc sau:

Route::filter('sentryAuth', function() { 

if (!Sentry::check()) { 

    return Redirect::route('login'); 
} 
}); 

Route :: lọc ('sentryGuest', function() {

if (Sentry::check()) { 
    return Redirect::intended('dashboard'); 
} 
}); 

Trong UserController của tôi, tôi có đoạn mã sau :

public function postAuthenticate() 
{ 
    try { 
     // Set login credentials 
     $credentials = array(
      'email' => Input::get('email'), 
      'password' => Input::get('password') 
     ); 

     // Try to authenticate the user 
     $user = Sentry::authenticate($credentials, false); 
    } catch (Cartalyst\Sentry\Users\LoginRequiredException $e) { 
     echo 'Login field is required.'; 
    } 
    catch (Cartalyst\Sentry\Users\PasswordRequiredException $e) { 
     echo 'Password field is required.'; 
    } 
    catch (Cartalyst\Sentry\Users\UserNotFoundException $e) { 
     echo 'User was not found.'; 
    } 
    catch (Cartalyst\Sentry\Users\WrongPasswordException $e) { 
     echo 'Wrong password, try again.'; 
    } 
    catch (Cartalyst\Sentry\Users\UserNotActivatedException $e) { 
     echo 'User is not activated.'; 
    } 

    if (!Sentry::check()) { 
     return Redirect::to('user/login'); 
    } else { 
     return Redirect::intended('dashboard'); 
    } 
} 

Tôi đã cố gắng truy cập trang 'đặt chỗ/tạo' mà không đăng nhập. o trang đăng nhập, đăng nhập nhưng sau đó nó sẽ đưa tôi đến bảng điều khiển không để đặt/tạo.

AM Tôi thiếu gì đó ở đây? Có mã bổ sung nào tôi cần để có được ý định làm việc không ??

Trả lời

8

Tôi không chắc chắn về điều này, bởi vì tôi không sử dụng Sentry cho dự án hiện tại của tôi .. vì vậy đây chỉ là một linh cảm.

Dường như kể từ khi bạn sử dụng SentryAuth và không phải là lớp Auth bản địa laravel 4, mục phiên cho các url có ý định không được thiết lập .. Tôi nhìn về API trên lớp Redirector và tôi thấy điều này:

public function intended($default, $status = 302, $headers = array(), $secure = null) 
{ 
    $path = $this->session->get('url.intended', $default); 

    $this->session->forget('url.intended'); 

    return $this->to($path, $status, $headers, $secure); 
} 

và như mã cho biết, khóa phiên là 'url.intended'. tôi đã xác minh điều này bằng cách sử dụng bộ lọc Auth gốc và URL dự định được đặt trên Session::get('url.intended') như mong đợi ..

do đó, giải pháp có thể cho điều này là đặt thủ công nó trong phiên. một ví dụ sẽ là:

Mở bộ lọc của bạn

Route::filter('sentryAuth', function() { 

    if (!Sentry::check()) { 
     Session::put('loginRedirect', Request::url()); 
     return Redirect::route('login'); 
    } 
}); 

On postAuthenticate của bạn) phương pháp (

if (!Sentry::check()) { 
    return Redirect::to('user/login'); 
} else { 
    // Get the page we were before 
    $redirect = Session::get('loginRedirect', 'dashboard'); 

    // Unset the page we were before from the session 
    Session::forget('loginRedirect'); 

    return Redirect::to($redirect); 
} 

phần của mã được lấy từ here để tham khảo ..^_^

+0

xuất sắc trả lời - những thay đổi làm việc và chuyển hướng xảy ra như mong đợi. Cảm ơn bạn – Ray

4

@ câu trả lời của reikyoushin là tuyệt vời. Đây là một phiên bản hơi khác.

tuyến đường.php

// NOTE: do NOT name your filter "auth" as it will not override 
//  Laravel's built-in auth filter and will not get executed 
Route::filter('sentryAuth', function() 
{ 
    // check if logged in or not 
    if (! Sentry::check()) 
    { 
     // the guest() method saves the intended URL in Session 
     return Redirect::guest('user/login'); 
    } else { 
     // now check permissions for the given route 
     $user = Sentry::getUser(); 
     if (! $user->hasAccess(Route::currentRouteName())) 
     { 
      // redirect to 403 page 
      return Response::make('Forbidden', 403); 
     } 
    } 
}); 

// Protected routes 
Route::group(array('before' => 'sentryAuth', function() 
{ 
    Route::get('admin', function() { return View::make('admin.index'); }); 
}); 

và chức năng đăng nhập của bạn:

public function login() { 
    try { 
     $creds = array(
      'email' => Input::get('email'), 
      'password' => Input::get('password') 
     ); 
     $user = Sentry::authenticate($creds); 
     return Redirect::intended('dashboard'); 
    } catch (Exception $e) { 
     // handle exceptions 
    } 
} 
10

Trong filters.php bạn hãy chắc chắn để sử dụng:

return Redirect::guest('login'); 

thay vì

return Redirect::route('login'); 

Các khách chức năng sẽ đặt t ông sửa các biến phiên cho dự định() để hoạt động đúng.

0

Cách dễ nhất.

Trong bộ lọc Auth bạn sử dụng như sau:

Route::filter('sentryAuth', function() 
{ 
    if (! Sentry::check()) 
    {  
     return Redirect::guest(route('login')); 
    } 
}); 

Trong điều khiển của bạn:

public function postAuthenticate() 
{ 
    try { 
      $credentials = array(
      'email' => Input::get('email'), 
      'password' => Input::get('password') 
     ); 

     $user = Sentry::authenticate($credentials, false); 
    } catch() { 
     // validation errors 
    } 

    //firstly, Laravel will try to redirect intended page. 
    //if nothing saved in session, it will redirect to home. 
    //you can use any route instead of home. 

    return Redirect::intended(route('home')); 
} 

Xong.

Ngoài Sentry:

Mã này có thể được sử dụng với bất kỳ loại hình thư viện xác thực. Bạn cần hai điều để thực hiện chuyển hướng đích:

1.in lọc auth của bạn:

 
    Route::filter('auth', function() 
    { 
     if (! Sentry::check()) 
      { 
      return Redirect::guest(route('login')); 
      } 
    }); 

2.After đăng nhập người dùng:

 
//firstly, Laravel will try to redirect intended page. 
//if nothing saved in session, it will redirect to home. 
//you can use any url instead of '/' 

return Redirect::intended('/');