2015-11-06 39 views
8

Pracuję nad aplikacją panelu sterowania, w której mam kilka ról użytkowników, takich jak globaladmin, edytory itp. Teraz chcę używać tych ról z jednym zasobem UserController.Potrzebuję sugestii dotyczących używania ról Entrust w jednym kontrolerze zasobów - Laravel5

Na przykład globaladmins powinien mieć możliwość wykonywania wszystkich metod Restful, a edytor może tylko wyświetlać i aktualizować użytkownika.

Wiem, że powierzenie pochodzi z middlewarem po wyjęciu z pudełka, które idealnie pasuje do tego, czego potrzebuję. Ale działa tylko na trasach (w takim przypadku potrzebowałbym osobnego kontrolera dla każdej roli).

Mój UserController wygląda mniej więcej tak.

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() 
} 

muszę middleware w konstruktorze, który sprawdzenia roli użytkownika, a następnie pozostawić tylko użyć metody tylko wtedy, gdy rola ma uprawnienie do korzystania z niego. Ale powinno to być zrobione w porządny sposób bez żadnych hacków, ponieważ będę go używał również na innych kontrolerach.

Odpowiedz

4

Zakładam, że używasz następujących w swoich tras file:

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

W tym przypadku, chciałbym zaproponować, że używasz jednego z middleware świadczonych przez Entrust jako podstawy i odzyskać zwaną metodę np jeśli używasz EntrustRole:

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); 
} 

Oczywiście jest to tylko wskazówka i powinny znaleźć lepszy sposób, aby wyodrębnić zwanej metody i nadal trzeba zaimplementować retrieveRequiredRolesForMethod

+0

Dziękuję za odpowiedź. Chociaż przeszedłem inną drogą posiadania indywidualnego kontrolera dla każdej roli, ze względu na złożoność aplikacji. Ale naprawdę podoba mi się ten pomysł. Poczekajmy i zobaczmy, czy ktoś przedstawi nową perspektywę. –

0

Ah .. Myślę, że to będzie działać w Twój przypadek.

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']]);    

    } 
} 

Tutaj USER_INDEX, user_create, user_edit etc są uprawnienia (wpisy w polu Nazwa tabeli uprawnienie) do modułu użytkownika.

Spowoduje to automatyczne sprawdzenie zalogowanego użytkownika i wyświetlenie odpowiedniej strony.