Hallo, ik experimenteer momenteel in Laravel om een webshop te maken. (een test projectje). Ik heb nog maar weinig ervaring met frameworks, daarom deze vraag.
In Laravel 5.2 kan je via php artisan make:auth een standaard authenticatie bouwen. die werkt goed, maar ik zou graag het volgende willen:
De meeste routes moeten beschikbaar zijn voor zowel gastbezoekers als aangemelde gebruikers. Bovenaan in de navbar staat dan ofwel een login-link, ofwel de naam van de aangemelde gebruiker. Maar ik wil ook een admin gedeelte die enkel admin gebruikers kunnen bezoeken.
Hoe pak ik dit aan? Kan dit iets te maken hebben met de Middleware? Bestaat er een mooie tutorial hierover? Jeffrey Way van Laracasts heeft alvast nog geen tutorial hiervoor, hoewel ik al veel geleerd heb van hem :-)
Maar in Laravel 5.2 is dit veranderd.
Nu dien je gebruik te maken van HTTP Middleware.
"HTTP middleware provide a convenient mechanism for filtering HTTP requests entering your application. For example, Laravel includes a middleware that verifies the user of your application is authenticated. If the user is not authenticated, the middleware will redirect the user to the login screen. However, if the user is authenticated, the middleware will allow the request to proceed further into the application."
<?php
Route::group(['middleware' => ['auth']], function () {
// Hier routes waarvoor je ingelogd moet zijn
});
?>
Bovenstaande code is voor Routes waar je ingelogd voor moet zijn.
Wat jij dus ook wilt, is enkel ingelogde gebruikers && administrators. Hiervoor maak je volgens mij dan best een nieuwe middleware klasse aan.
Routers die voor iedereen toegankelijk zijn plaats je buiten de Route-group.
Groeten,
** knip **
[/code]
nog niet helemaal. Als ik naar je laatste code snip kijk, dan zie ik datje routers dubbel gedefinieerd hebt.
Dit is niet de bedoeling
<?php
# Deze routers zijn voor iedereen toegankelijk
# Hier wordt niet gecontroleerd of je al dan niet ingelogd bent.
# Iedereen kan aan deze routes!
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
Route::group(['middleware' => 'auth', function () {
// Iedereen kan deze routes benaderen, enkel als ze ingelogd zijn
Route::get('/mijnProfiel', 'HomeController@index');
}]);
Route::group(['middleware' => ['auth', 'admin']], function () {
// Iedereen kan deze routes benaderen, indien:
// ze voldoen aan Auth middleware
// ze voldoen aan Admin middleware
Route::get('/admin', 'HomeController@index');
Route::get('/admin/products', 'HomeController@products');
});
?>
Nu heb ik een middleware met als naam 'admin' gekozen.
Run volgende command
php artisan make:middleware AdminMiddleware
In de Handle methode kan je dan iets doen als Auth::user()->isAdministrator ...
Je kan ook de laravel-authorize package gebruiken. Deze komt met een ingebouwde middleware om een gebruiker's ability te controlleren:
<?php
// can:visit-admin-panel betekend dat de "can" middleware wordt aangeroepen. Deze
// controleert vervolgens of de huidige gebruiker de "visit-admin-panel" ability heeft.
Route::group(['prefix' => '/admin', 'middleware' => 'can:visit-admin-panel'], function () {
Route::get('/', 'AdminController@index');
Route::get('/products', 'AdminController@products');
});
// definieer wanneer een gebruiker de "visit-admin-panel" ability heeft
$gate->define('visit-admin-panel', function ($user, $post) {
// bijvoorbeeld wanneer iemand een administrator is
return $user->isAdministrator();
});
}