Laravel 5.2 Auth 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 :-)
Alvast bedankt!
Groetjes
Jan
Ik gebruik nog Laravel 4.2 en daar kan je het volgende doen:
https://laravel.com/docs/4.2/routing#route-groups
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."
Code (php)
1
2
3
4
5
2
3
4
5
<?php
Route::group(['middleware' => ['auth']], function () {
// Hier routes waarvoor je ingelogd moet zijn
});
?>
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 **
Gewijzigd op 11/06/2017 12:18:47 door - Ariën -
bedankt voor je reactie! Als beginner in het hele framework/OOP gebeuren heb ik toch nog enkel vraagjes:
Momenteel is dit mijn route bestand:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
});
?>
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
});
?>
Als ik het goed begrijp, moet ik dit dan aanpassen naar dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
});
?>
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/home', 'HomeController@index');
Route::get('/products', 'HomeController@products');
});
?>
Dus dezelfde route staat in de middleware en ook erbuiten.
Maar hoe maak ik dan een nieuwe middleware klasse aan voor de admin gebruiker?
Gewijzigd op 11/06/2017 12:18:58 door - Ariën -
nog niet helemaal. Als ik naar je laatste code snip kijk, dan zie ik datje routers dubbel gedefinieerd hebt.
Dit is niet de bedoeling
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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');
});
?>
# 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
In de Handle methode kan je dan iets doen als Auth::user()->isAdministrator ...
Snap je dit nu wat beter?
** knip **
Gewijzigd op 11/06/2017 12:19:15 door - Ariën -
laravel-authorize package gebruiken. Deze komt met een ingebouwde middleware om een gebruiker's ability te controlleren:
Je kan ook de Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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');
});
// en dan in een service provider (zie ook https://laravel.com/docs/5.2/authorization#defining-abilities)
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
// 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();
});
}
// 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');
});
// en dan in een service provider (zie ook https://laravel.com/docs/5.2/authorization#defining-abilities)
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
// 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();
});
}
OK, ik heb geprobeerd om het als volgt op te lossen:
Hier mijn routes.php:
Code (php)
de bouwt alle routes die met authentication te maken heeft zoals /login, /logout, enz...
Dit is mijn route:list:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | |
| | GET|HEAD | admin | | Closure | auth,admin |
| | POST | login | | App\Http\Controllers\Auth\AuthController@login | auth,guest |
| | GET|HEAD | login | | App\Http\Controllers\Auth\AuthController@showLoginForm | auth,guest |
| | GET|HEAD | logout | | App\Http\Controllers\Auth\AuthController@logout | auth |
| | POST | password/email | | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | auth,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\PasswordController@reset | auth,guest |
| | GET|HEAD | password/reset/{token?} | | App\Http\Controllers\Auth\PasswordController@showResetForm | auth,guest |
| | POST | register | | App\Http\Controllers\Auth\AuthController@register | auth,guest |
| | GET|HEAD | register | | App\Http\Controllers\Auth\AuthController@showRegistrationForm | auth,guest |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | |
| | GET|HEAD | admin | | Closure | auth,admin |
| | POST | login | | App\Http\Controllers\Auth\AuthController@login | auth,guest |
| | GET|HEAD | login | | App\Http\Controllers\Auth\AuthController@showLoginForm | auth,guest |
| | GET|HEAD | logout | | App\Http\Controllers\Auth\AuthController@logout | auth |
| | POST | password/email | | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | auth,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\PasswordController@reset | auth,guest |
| | GET|HEAD | password/reset/{token?} | | App\Http\Controllers\Auth\PasswordController@showResetForm | auth,guest |
| | POST | register | | App\Http\Controllers\Auth\AuthController@register | auth,guest |
| | GET|HEAD | register | | App\Http\Controllers\Auth\AuthController@showRegistrationForm | auth,guest |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
Mijn middleware admin bestand 'Admin.php' bevat dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($request->user()){
if($request->user()->admin){
// in mijn user table een bool veld 'admin' toegevoegd dus dit geeft 'true' indien admin
return $next($request);
}else{
// geen admin wel aangemeld
return redirect('/');
}
}else{
// niet aangemeld
return redirect('/auth/login');
}
}
}
?>
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($request->user()){
if($request->user()->admin){
// in mijn user table een bool veld 'admin' toegevoegd dus dit geeft 'true' indien admin
return $next($request);
}else{
// geen admin wel aangemeld
return redirect('/');
}
}else{
// niet aangemeld
return redirect('/auth/login');
}
}
}
?>
Nu krijg ik telkens de melding "Deze webpagina bevat een omleidingslus" - wat doe ik nu verkeerd?
Wat ik wel nogmaals wil vermelden is dat ik Laravel 5.2 gebruik, misschien zijn er verschillen / aanpassingen gemaakt in de middleware classes?
Nogmaals bedankt voor jullie tijd!
Greetz,
Jan