2012-12-06 13 views
5

Utworzyłem Uwierzytelnianie i działa ono idealnie. Ale jest problem z sprawdzeniem wewnętrznych stron. Na przykład:Kontrola uwierzytelniania Laravel dla wszystkich stron

Route::get('/', array('before' => 'auth' , 'do'=> function(){ 
return View::make('home.index'); 
})); 

Strona indeksu jest widoczna tylko dla zalogowanych użytkowników. Ale zawsze, gdy mam przejść do wewnętrznych stron, na przykład example.com/products. Strona produktów może być widoczna bez zalogowania.

Odpowiedz

1

Sprawdź, czy użytkownik jest zalogowany w swoich widokach. lub ograniczyć cały regulator (jeśli używasz go) lub sprawdź Grupy trasy i dać filtr do całej grupy trasach: http://laravel.com/docs/routing#groups

+0

Tak, mogę to zrobić. Problem polega na tym, że mam dużo wewnętrznych stron. Nie można sprawdzić wszystkich stron. Powinno być proste rozwiązanie. – Mifas

+0

Po prostu zredagowałem moją odpowiedź. – matiit

+1

Grupy tras są idealne do zastosowania filtrów, aby to osiągnąć, ale nie sugerowałbym robienia tego na poziomie widoku jako realnej alternatywy - nie kopie wystarczająco wcześnie (tzn. 'POST' może nadal wywoływać efekt, zanim zaczniesz renderować widok, który następnie wyrzuca użytkownika) – Simon

8

Istnieje kilka sposobów nakładania filtrów na wielu trasach.

Umieszczenie rotusów w Route::group() lub jeśli używasz kontrolerów, dodaj tam filtr, dodaj go do Base_Controller, aby został zastosowany do wszystkich. Możesz również użyć wzorców filtrów i użyć wyrażenia regularnego, które zastosuje filtr do wszystkich oprócz kilku, których nie chcesz.

Dokumentacja

filtry Ścieżka: http://laravel.com/docs/routing#route-filters

przykład filtra wzór, jak inne są w zasadzie na dokumenty. Ten może być najszybszy, ale także najbardziej problematyczny ze względu na problematyczny sposób zarejestrowania wyrażenia regularnego w tej funkcji (* jest faktycznie przekształcany w (.*)).

Route::filter('pattern: ^(?!login)*', 'auth'); 

To będzie obowiązywało na każdej trasie, z wyjątkiem example.com/login.

1
Route::filter('pattern: /*', array('name' => 'auth', function() 
{ 
    return View::make('home.index'); 
})); 
2

Może być lepszy sposób, ale przyjmuję podejście białej listy. Wszystko jest zablokowane publicznie, poza tym, jakie strony umieszczam w tej tablicy.

// config/application.php 
return array(

    'safe' => array(
     '/', 
     'card/form_confirm', 
     'record/form_create', 
     'card/form_viewer', 
     'user/login', 
     'user/quick_login', 
     'user/register', 
     'info/how_it_works', 
     'info/pricing', 
     'info/faq', 
     'info/our_story', 
     'invite/accept', 
     'user/terms', 
     'user/privacy', 
     'email/send_email_queue', 
     'user/manual_login', 
     'checkin/', 
     'checkin/activate', 
     'system/list', 
    ), 

// routes.php 
Route::filter('before', function() 
{ 
    // Maintenance mode 
    if(0) return Response::error('503'); 

    /* 
     Secures parts of the application 
     from public viewing. 
    */ 
    $location = URI::segment(1) . '/' . URI::segment(2); 
    if(Auth::guest() && !in_array($location, Config::get('application.safe'))) 
     return Redirect::to('user/login'); 
}); 
7

Oto moje rozwiązanie.

/** 
* Groups of routes that needs authentication to access. 
*/ 
Route::group(array('before' => 'auth'), function() 
{ 
    Route::get('user/logout', array(
     'uses' => '[email protected]', 
    )); 

    Route::get('/', function() { 
     return Redirect::to('dashboard'); 
    }); 

    Route::get('dashboard', array(
     'uses' => '[email protected]', 
    )); 

    // More Routes 

}); 

// Here Routes that don't need Auth. 
+0

Proste, ale skuteczne, nie? – thesunneversets

0

To zadziałało dla mnie. Spójrz na to.

Route::when('*', 'auth.basic'); 

Route::get('api/getactorinfo/{actorname}', array('uses' =>'[email protected]')); 
Route::get('api/getmovieinfo/{moviename}', array('uses' =>'[email protected]')); 
Route::put('api/addactor/{actorname}', array('uses' =>'[email protected]')); 
Route::put('api/addmovie/{moviename}/{movieyear}', array('uses' =>'[email protected]')); 
Route::delete('api/deleteactor/{id}', array('uses' =>'[email protected]')); 
Route::delete('api/deletemovie/{id}', array('uses' =>'[email protected]')); 
Powiązane problemy