2016-05-12 9 views
1

Ich mache Projekt in Laravel. Ich möchte Benutzer entsprechend seiner Rolle umleiten.Wie wird nach Benutzerrolle mit Middleware umgeleitet?

Meine Tabellen sind,

Benutzer Tabellenfelder mit (ID, Name, Passwort).

Rolle Tabelle mit Feldern (ID, Rolle).

assigned_role Tabelle mit Feldern (id, role_id, user_id).

Ich habe User-Modell als,

User.php

public function roles() 
{ 
    return $this->belongsToMany('App\Role', 'assigned_roles', 'user_id', 'role_id'); 
} 

Dafür habe ich eine Middleware als

RoleMiddleware 'RoleMiddleware' genannt erstellt haben:

public function handle($request, Closure $next) 
{ 
    $roles = $request->user()->roles; 
    foreach ($roles as $role) { 
     if($role->name != 'super-admin') 
      return redirect('/user'); 
    } 

    return $next($request); 
} 

ich diese Middleware in kernel.php-Datei haben,

Kernel.php wie, ich weiß nicht,

protected $routeMiddleware = [ 
    'auth' => \App\Http\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 
    'role' => \App\Http\Middleware\RoleMiddleware::class, 

]; 

aber jetzt sieht, wie diese Middleware zu verwenden. Als ich diese Middleware in als Route.php Datei hinzufügen,

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

    Route::auth(); 
    Route::group(['middleware' => 'role'], function() { 
     Route::get('/home', '[email protected]'); 
     Route::get('/user', '[email protected]'); 

    }); 
}); 

Aber wenn ich Prozess hat loggen leitet es an die richtige URL. Aber jetzt kann es Zugriff auf die Innenseiten geben, ohne zu prüfen, ob der Benutzer angemeldet ist oder nicht. Wenn ich einen Kommentar zum RoleMiddleware-Teil abgib, wird verhindert, dass auf interne Seiten zugegriffen wird, es sei denn, der Benutzer führt eine Protokollierung durch.

Ich weiß nicht, wie das geht.

+1

Sie leiten den Benutzer nur dann um, wenn er NUR die Rolle 'Super-Admin' hat. In allen anderen Fällen wird der Benutzer umgeleitet. – blablabla

+0

Ich bekomme nicht das, was Sie versuchen zu sagen – Amarja

Antwort

1

Wenn ich Sie richtig verstanden:

  • Sie möchten Benutzer beschränken, die nicht die Super-Admin-Rolle hat (weither sie oder nicht authentifiziert werden), um sie zu verhindern, dass eine bestimmte URL zugreifen.
  • Sie versuchen auch, alle authentifizierten Benutzer, die nicht die Super-Admin-Rolle haben, an die URL /user umzuleiten.

Korrekt?

Hier ist, wie dies zu tun:

In Ihren Routen.PHP-Datei benötigen Sie Routen für den Superadmin Benutzer und authentifizierte Benutzer zur Verfügung zu stellen (ohne Superadmin Rolle)

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

    Route::auth(); 

    Route::group(['middleware' => ['auth', 'role']], function() { 
     // All routes you put here can only be accessible to users with super-admin role 

    }); 

    Route::group(['middleware' => 'auth'], function() { 
     // All routes you put here can be accessible to all authenticated users 

    }); 
}); 

Und in Ihrer Rolle Middleware Sie ohne die Superadmin Rolle authentifizierte Benutzer zu verhindern, müssen die angegebene URL zugreifen In diesem Fall einfach durch Umleiten zu einer anderen URL

+0

Schön, es funktioniert wie erwartet! Danke vielmals :) – Amarja

Verwandte Themen