2015-11-06 4 views
8

Ich arbeite an einer Systemsteuerung-App, wo ich mehrere Benutzer Rollen wie Globaladmin, Editoren usw. Jetzt möchte ich diese Rollen mit einer einzigen UserController-Ressource verwenden.Brauchen Sie Vorschläge für die Verwendung von Entrust Rollen in einem einzigen Ressourcen-Controller - Laravel5

Zum Beispiel sollte globaladmins alle Restful-Methoden ausführen können, während ein Editor nur einen Benutzer anzeigen und aktualisieren kann.

Ich weiß, dass das Vertrauen kommt mit Middleware aus der Box, die perfekt für das ist, was ich brauche. Aber es funktioniert nur auf den Routen (in diesem Fall würde ich separate Controller für jede Rolle benötigen).

Mein UserController sieht ungefähr so ​​aus.

Class UserController extends BaseController 
{ 
    $protected $viewfolder; 
    public function __construct 
    { 
     // Checking for role and then assigning the folder name of the views 
     $role = User::getRole(); 
     switch($role) 
     case 'globaladmin': 
       $this->viewfolder = 'globaladmin'; 
       break; 
     case 'editor': 
       $this->viewfolder = 'editor'; 
       break; 
     default: 
       abort(401, 'Access Denied'); 
       break; 
    } 

    public function index(){ 
     if(Entrust::can('view-all-users')){ 
      $users = User:all(); 
     } 
     return view($this->viewfolder.'.users.viewuser', compact('users')); 
    } 
    public function create() 
    public function update() 
    public function delete() 
} 

Ich brauche eine Middleware in dem Konstruktor, die für Benutzerrolle überprüfen würde und lassen nur die Methode nur verwenden, wenn die Rolle der Erlaubnis, es zu benutzen hat. Aber das sollte auf anständige Weise ohne irgendwelche Hacks getan werden, weil ich es auch auf anderen Controllern verwenden werde.

Antwort

4

Ich gehe davon aus, dass Sie in Ihren Routen Folgendes verwenden Datei:

Route::resource('users', 'UserController'); 

In diesem Fall würde ich vorschlagen, dass Sie eines der Middle von Entrust als Basis zur Verfügung gestellt verwenden und die genannte Methode abrufen , z.B wenn Sie EntrustRole verwenden:

public function handle($request, Closure $next) 
{ 
    $controllerMethod = Route::segment(3); 
    $roles = $this->retrieveRequiredRolesForMethod($method); 
    if ($this->auth->guest() || !$request->user()->hasRole(explode('|', $roles))) { 
     abort(403); 
    } 
    return $next($request); 
} 

Natürlich ist dies nur ein Hinweis und Sie sollten einen besseren Weg zu extrahieren die genannte Methode finden und müssen noch retrieveRequiredRolesForMethod

+0

Vielen Dank für Ihre Antwort. Obwohl ich wegen der Komplexität der App einen anderen Weg gegangen bin, einen individuellen Controller für jede Rolle zu haben. Aber ich mag diese Idee wirklich. Lasst uns warten und sehen, ob jemand eine neue Perspektive hat. –

0

Ah implementieren .. ich denke, das funktioniert in dein Fall.

class UserController extends Controller 
{ 
    public function __construct() 
    {       
     $this->middleware('permission:user_index', ['only' => ['index']]); 
     $this->middleware('permission:user_create', ['only' => ['create', 'store']]); 
     $this->middleware('permission:user_edit', ['only' => ['edit', 'update']]); 
     $this->middleware('permission:user_delete', ['only' => ['delete']]); 
     $this->middleware('permission:user_view', ['only' => ['show']]);    

    } 
} 

Hier USER_INDEX, user_create, user_edit etc. sind die Berechtigungen (Einträge in Permission-Tabelle Namensfeld) für Benutzermodul.

Dies überprüft automatisch die eingeloggte Benutzerfähigkeit und zeigt die Seite entsprechend an.

Verwandte Themen