Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MCV]sprawdzanie uprawnień user-ów w akcjach kontrolera
Forum PHP.pl > Forum > PHP > Object-oriented programming
albrzykowski
Witam,

Mam następujący problem:
Mam zbudowany główny kontroler a po nim dziedziczą inne.
W kontrolerach administratora są pewne metody możliwe do wywołania w zależności od rangi user-ów:
I przykładwy kod (w zarysie) wraz z potrzebnymi uprawnieniami (rangi: zarejestrowany|edytor|administrator)
  1. <?php
  2. class PostController extends Controller{
  3.  // edytor && admin
  4.  function listPost(){}
  5.  // edytor && admin
  6.  function addPost(){}
  7.  // admin
  8.  function removePost(){}
  9.  // admin
  10.  function publishPost(){}
  11. }
  12. ?>


i kwestia w tym, że chciałbym te rangi sprawdzić ale nie wiem czy jest możliwość zrobienia tego nie bezpośrednio w każdej metodzie.
Myślałem nad zmapowaniem kontrolerów i metod np w bazie, niemniej też natknąłem się na problemy i przede wszystkim zastanawiałem się nad optymalnym rozwiązaniem.

Dodam jeszcze, że nie chce mieć zdeklarowanych na zewnątrz uprawnień do ogólnych metod, tzn. że wszystkie metody publich we wszystkich kontrolerach mogą być wykonywane tylko przez administratora. Chciałbym mieć to bardzo rozdzielone.

Z góry dziękuję za sugestie i pozdrawiam!!
nasty
Witaj!

Pewnego razu też miałem taki dylemat w pewnej aplikacji.
Pomimo tego, że to była aplikacja w asp.net mvc, ale mvc to mvc - wszędzie jest podobne winksmiley.jpg

A więc tak, zrobiłem klasę BaseController, która dziedziczyła po Controller i po której dziedziczyły wszyskie klasy kontrollera. Ta klasa (BaseController) miała za zadanie sprawdzenia czy użytkownik jest zalogowany, jaka jest jego rola itd... sprawdzała też czy zapytanie jest AJAX-owe czy też "normalne" itd..

Następnie stworzyłem atrybut ProtectedAction po czym poprostu oznaczłem metody akcji w kontrolerach takimi atrybutami i to było zautomatyzowane.
Przykład:

Kod
class Dupa extends BaseController
{

    [ProtectedAction]
    public ActionResult Index()
    {
      // tą metodę wykona tylko użytkownik zalogowany. W razie nie znalezienia sesji zalogowanego użytkownika, zostaje przekierowany na strone z logowaniem.
    }
    
    public ActionResult Costam()
    {
     //  a tą metodę wykona każdy.
     }
}
albrzykowski
Hej,

Zastanawiałem się nad następującym rozwiązaniem ale nie wiem czy słusznie.

Mój FrontController posiada interface, kontrolery admina implementują go i oczywiście dziedziczą po FrontControllerze.
Myślałem nad następującą rzeczą. Napisanie klasy abstrakcyjnej typu: AdminContent, z typowimi metodami add, publish, remove, edit, update. W sumie tyle wystarczyłoby mi do obsługi różengo rodzaju zawartości np. news-y, strony statyczne, userzy, pliki etc.
I właśnie w abstrakcyjnej klasie zdeklarować sprawdzanie uprawnień następnie dziedziczyć po niej a nie po FrontControllerze.
Nie wiem czy jednak klasa abstrakcyjna byłaby odpowiednim rozwiązaniem.

Oczywiście samo sprawdzanie uprawnień, mógłbym wstawić ręcznie gdyż obecnie panel posiada około 10 kontrolerów i średnio po 5 metod zardządziania poszczególnymi rodzajami zawartości. Niemniej wtedy, ograniczyłbym możliwość edycji uprawnień do poszczególnych działów panelu.
Zastanawiałem się też nad tabelą w bazie tego typu:
| id | nazwa_klasy | metoda |
----------------------------------
| 1 | AdminNews | addNews |

oraz druga z przypisanymi uprawnieniami:
| id | nazwa sekcji | admina | edytor | zarejestrowany_user |
------------------------------------------------------------------------
| 1 | 1 (id z pierwszej tabeli)| 1 | 0 | 0 |

Prosze o sugestie nad lepszym rozwiązaniem, lub całkiem nowe.

Dzięki i pozdrawiam.
megawebmaster
Dopisz sobie np. funkcję do której przekażesz poziom i nazwę funkcji. Jeżeli masz odpowiedni wpis np. w tablicy to zostaje udzielone zezwolenie. W przeciwnym wypadku wypisujesz błąd i stopujesz wykonywanie skryptu (exit;). Chyba najprostsze możliwe rozwiązanie. Tablicę tą oczywiście mógłbyś przykładowo wczytywać z pliku. I już.
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.