Laravel 5.2 Auth vraag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Liefhebber Laravel

Liefhebber Laravel

22/01/2016 19:23:40
Quote Anchor link
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 :-)

Alvast bedankt!
Groetjes
Jan
 
PHP hulp

PHP hulp

22/12/2024 14:58:25
 
 - Diov  -

- Diov -

23/01/2016 11:19:55
Quote Anchor link
Hallo,
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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 **
Gewijzigd op 11/06/2017 12:18:47 door - Ariën -
 
Liefhebber Laravel

Liefhebber Laravel

23/01/2016 13:13:36
Quote Anchor link
Hallo ** knip **,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
});

?>


Als ik het goed begrijp, moet ik dit dan aanpassen naar dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
});

?>


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 -
 
 - Diov  -

- Diov -

23/01/2016 14:10:17
Quote Anchor link
Hallo Jan,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
});

?>


Nu heb ik een middleware met als naam 'admin' gekozen.
Run volgende command
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
php artisan make:middleware AdminMiddleware

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 -
 
Wouter J

Wouter J

24/01/2016 13:11:21
Quote Anchor link
Je kan ook de laravel-authorize package gebruiken. Deze komt met een ingebouwde middleware om een gebruiker's ability te controlleren:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
    });
}
 
Liefhebber Laravel

Liefhebber Laravel

26/01/2016 21:31:07
Quote Anchor link
Hallo,

OK, ik heb geprobeerd om het als volgt op te lossen:

Hier mijn routes.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
Route::get('/', function () {
    return view('welcome');
});

Route::group(['middleware' => ['auth', 'admin']], function () {

    Route::get('admin', function(){
        return('Admin Page');
    });
});

Route::group(['middleware' => 'auth'], function () {
    Route::auth();
});

?>


de
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Route::auth()
bouwt alle routes die met authentication te maken heeft zoals /login, /logout, enz...

Dit is mijn route:list:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+


Mijn middleware admin bestand 'Admin.php' bevat dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
       }
   }
}

?>


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.