Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][Laravel5.0] Zizaco/Entrust - Zastosowanie w praktyce
Forum PHP.pl > Forum > PHP > Frameworki
mariio81
Witam,
dokładam do pisanej aplikacji zarządzanie użytkownikami (Zizaco/Entrust) i zrobiłem wszystko według instrukcji na githubie. Dodaje role, uprawnienia, przypisuje użytkownikom role tylko problem jest z zastosowaniem tego w panelu do blokowania dostępu. I tutaj mam kilka pytań bo dodaję kontrolę na poziomie routingu według instrukcji:
  1. Route::filter('superadmin', function()
  2. {
  3.  
  4. if (!Entrust::hasRole('superadmin')) {
  5. App::abort(403);
  6. }
  7. });
  8.  
  9.  
  10. Route::when('admin*', 'superadmin);

(Tak znalazłem na jednym blogu odnośnie tego dodatku)
i nic nie blokuje Uzytkownik admin ma rolę superadmin a drugi nie mając żadnej roli i tak ma dostęp do wszystkiego. Próbowałem też w kontrolerze sprawdzać rolę aktualnie zalogowanego ale też wszyscy mają dostęp. Coś chyba źlę robię i zastanawiam sięgdzielepiej zrobić kontrolę na poziomie routingu czy w kontrolerze wogóle jak to poprawnie użyć?
Pyton_000
Ja stosowałem Middleware dla admina:
  1. <?php namespace Mylead\Http\Middleware;
  2.  
  3. use Carbon\Carbon;
  4. use Closure;
  5. use Illuminate\Contracts\Auth\Guard;
  6.  
  7. class AuthAdmin
  8. {
  9. /**
  10.   * Handle an incoming request.
  11.   *
  12.   * @param \Illuminate\Http\Request $request
  13.   * @param \Closure $next
  14.   *
  15.   * @return mixed
  16.   */
  17. public function handle($request, Closure $next)
  18. {
  19. if (auth()->check() && auth()->user()->hasRole('admin')) {
  20. return $next($request);
  21. }
  22.  
  23. if ($request->ajax()) {
  24. return response('Unauthorized.', 401);
  25. }
  26.  
  27. return redirect()->guest('auth/login');
  28. }
  29. }

Jest to jedno z wielu rozwiązań.

mariio81
Myślałem też o Middleware żeby ogólnie sprawdzać dostęp. Ogólnie w tym co robię ma być z panelu admina dodawanie użytkowników, nowe role, uprawnienia, przypisywanie roli użytkownikom i jeszcze może pojawić się nowy moduł i trzeba będzie niektórym użytkownikom ograniczyć dostęp do niego. Trochę rozbudowane ale wszystko ma być konfigurowalne z panelu więc tutaj przypisania na sztywno odpadają. Nie bardzo rozumiem z tego nadawanie uprawnień np:
  1. $editUser = new Permission();
  2. $editUser->name = 'edit-user';
  3. $editUser->display_name = 'Edit Users';
  4. $editUser->description = 'edit existing users';
  5. $editUser->save();

w przykładzie tworzę uprawnienie 'edit-user' a jak to się ma do konkretnego kontrolera?
Dla przykładu gdy mam link '/admin/ustawienia' to w jaki sposób wyglada tutaj powiązanie zasobów z uprawnieniami?
Pyton_000
Jeśli chodzi o permissions to ustalasz na poziomie metod. Role możesz ustawiać dowolnie, tam gdzie potrzebujesz np. w kostruktorze
Dowolność jest twoim przyjacielem
mariio81
Wielkie dzieki będę teraz poprawki robił.

NIe wiem czy dobrze rozumiem czyli robiąc kontrolę roli mogę dodać taki kod:
  1. $user = User::where('name', '=', 'admin')->first();
  2. if(!$user->hasRole('superadmin')) {
  3. return 'Brak dostępu';
  4. }


a w metodzie do ustalania uprawnień :
  1. $user = User::where('name', '=', 'admin')->first();
  2. if(!$user->can('edit-user')) {
  3. return 'Brak dostępu';
  4. }


czy nadal to źle rozumiem.
Pyton_000
przecież masz sprawdzać uprawnienia dla zalogwanego uzytkownika więc:

  1. !auth()->user()->hasRole('admin')
mariio81
No tak powinno być, bezmyślnie przepisałem z dokumentacji.
Dodałem w metodzie:
  1. if (!auth()->user()->can('edit-user')) {
  2. return view('admin.contents.401');
  3. }

ładnie blokuje dla drugiego użytkownika.
Wystarczy powstawiać do metod oczywiście zmieniając uprawnienia dla każdej z nich i to wystarczy bez korzystania z:
  1. !auth()->user()->hasRole('admin')
?
Mam rozumieć albo to albo to drugie w zalezności jaki jest zakres dostępu czy cały kontroler czy poszczególne metody.
Pyton_000
Zależy na jakim poziomie chcesz mieć uprawnienia.

Możesz dać ogólny dostęp hasRole('admin'), a możesz mieć też np. JuniorAdmin który can('show-users')

Wszystko zależy od potrzeby
mariio81
Tak myslałem tylko to całe zarządzanie uprawnieniami ma być jako opcjonalny plugin doinstalowywany do aplikacji i podczas działania aplikacji będą tworzone nowe role, bedą pojawiały sie inne dodatki i niewiadomo kto na jakim poziomie będzie uprawnienia i w takim przypadku wydaje mi się bezpieczniejszym rozwiązaniem can('show-users').
Ogólnie ma to działać tak:
Aplikacja w podstawowej wersji będzie miała tylko profil użytkownika i ustawienia strony. Plugin z uprawnieniami bedzie doinstalowywany. W takim przypadku podstawowa wersja bedzie miała dołaczony dodatek Entrust, skonfigurowany, dodane modele. Sam dodatek to bedzie oddzielna klasa do obsługi uprawnień wykorzystujaca Entrust. Instalacja bedzie polegała na wgraniu tabel do zarządzania uprawnieniami dodania do tabeli plugins nazwy dodatku i aktywowanie go.
Dodatkowo uprawnienia do podstawowych elementów byłyby w specjalnym pliku i podczas instalacji uzupełniona by została tabela permissions o te elementy.
Byłaby także specjalna funkcja która by sprawdzała czy plugin jest aktywny jeśli tak to następuje kontrola a jeśli nie wszystko jest po staremu.
W takim przypadku trochę ciężko by było ustawić automatyczna kontrolę na podstawie roli albo uprawnień.
Ogólnie nie wiem czy pomysł jaki tu przedstawiłem jest poprawny czy wogóle to się w ten sposób robi.
Pyton_000
Uprawnienia raczej powinny być podstawowym elementem.

Co do pluginów każdy będzie musiał mieć już zdefiniowane role które powinny być dodawane do systemu.
mariio81
Z założenia ma to być system Cms w którym Uprawnienia są opcją do doinstalowania.
Co do pluginów to nie same uprawnienia ale też role.
A wychodząc całkowicie poza temat do tworzenia pluginów dobre byłoby przez Package Development czy to raczej nadaje się do tworzenia paczek typu entrust?
Pyton_000
PD jak najbardziej się do tego nadaje.
mariio81
Cytat
PD jak najbardziej się do tego nadaje.

Właśnie czytałem o tym na twoim blogu.
A wracając jeszcze do sposobu instalacji pluginu to paczkę entrust instalować tak jak pisałem czyli w podstawowej wersji aplikacji z całą konfiguracją i tabele w bazie utworzyć nawet gdy plugin nie będzie zainstalowany czy tabele tworzyć w trakcie instalacji pluginu czy może jeszcze paczkę entrust instalować i konfigurować dopiero przy instalacji pluginu?
Pyton_000
Tak jak pisałem, entrust wpakowałbym jako element stały w aplikacji.
Ale jeśli już chcesz to instalować to przy instalacji twórz wszystko, a przy wywalaniu wywal
mariio81
Dzięki za odpowiedź. Mam nadzieje że już nie będę miał większych problemów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.