Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: panel administracyjny w frameworkach
Forum PHP.pl > Forum > PHP > Object-oriented programming
Apo
Witam
Natrafiłem na następujący problem podczas pisania frameworka:
Na podastawie adresu http://strona.pl/controller/action wywołuje odpowiedni obiekt controllera a potem metode na podstawie nazwy akcji. No i powiedzmy ze kontroler nazywa sie 'newsy' czyli mam folder newsy a w nim główny plik kontrolera news.php i w nim wszystkie metody np: 'wyswietlNews', 'archiwum' oraz te co powinny być dostępne z panelu administrcyjnego: 'edytuj', 'akceptuj', 'dodaj', ale nie wiem jak skutecznie rozwiązać prolem z logowaniem aby np po przejsciu do innego kontrolera ('forum') nie trzeba było sie pomownie logować. Chodzi mi o przykładowe API z waszych frameworków smile.gif

Pozdrawiam Apo
nrm
w roznych fm roznie to pewnie mozna rozwiazac.

w cakePHP masz nadrzedny kontroler gdzie mozesz umiescic akcje dla wszystkich, skorzystac np. z beforeFilter

  1. <?php
  2. class AppController extends Controller {
  3.  
  4.  var $beforeFilter = array('isLogged');
  5.  
  6. function isLogged()
  7. {
  8. }
  9. ?>
Prph
Moje rozwiazanie jest nastepujace:

1. Kazda akcja to osobna klasa. Czyli mam np. klasy DodajNowosc, EdytujNowosc, PokazZdjecie. W klasach tych wymagana jest metoda execute(), ktora zawiera cialo akcji.

Ponad to Akcja musi miec zdefiniowana metode isSecure zwracajaca wartosc logiczna, ktora informuje framework, czy nalezy sprawdzac bezpieczenstwo.

Jezeli isSecure zwraca true, pobierany jest konfig akcji i sprawdzany jakie grupy sa wymagane. Framework sprawdza, czy uzytkownik je ma i odpowienio - olbo odrzuca akcje, albo ja wykonuje.

Jak wykorzystac to w panelu?

Akcje typu PokazNewsa, DodajKomentarz nie musza korzystac z bezpieczenstwa. Ale UsunNewsa, EdytujNewsa sa bezpieczne i wymagaja grypy np. admin albo moderator.

Ponad to, zwracajac uwage na fakt, ze panel moze wygladac zupelni inaczej (wizualnie) od strony, to mozemy uzyc w tych akcjach innego szablonu dla widoku glownego smile.gif

Pozdrawiam, Adrian.
Ludvik
Hmmm... Ja mimo wszystko bym nie wiązał autoryzacji z samymi akcjami. Najlepiej tutaj sprawdza się wzorzec Intercepting Filter. Na samym końcu wstępnego filtrowania żądania autoryzujemy użytkownika. Interfejs filtru jest bardzo prosty:
  1. <?php
  2. interface RequestFilter {
  3. public function filter(Context $c);
  4. }
  5. ?>

Gdzie jedynym argumentem jest obiekt zawierającym wszystkie dane o kontekście żądania. Wszelkie operacje są wykonywane właśnie na tym obiekcie (np. zmiana łańcucha wywołania akcji).

Sprawdzać uprawnienia można na różne sposoby - pierwszą akcję lub cały łańcuch. Pierwsze rozwiązanie szybsze i wygodniejsze, drugie za to bezpieczniejsze.

Mój system autoryzacji i autentykacji możesz znaleźć tutaj.
Apo
@Ludvik rozpisales sie z tym kodem ;P

Wkońcu zaczełem pisać obsługe autoryzacji i mam takie cos:

  1. <?php
  2.  
  3. class Auth {
  4.  
  5. private $perms = array();
  6. private $groups = array();
  7. private $cursor;
  8.  
  9. const OWN = 'OWN';
  10. const ALL = 'ALL';
  11.  
  12. public function __construct()
  13. {
  14.  
  15. }
  16.  
  17. public function define($name, $level=null)
  18. {
  19. $level = isset($level) ? self::ALL : self::OWN;
  20. $this->perms[$name] = array($name, $level);
  21. }
  22.  
  23. public function addGroup($name)
  24. {
  25. if(isset($this->groups[$name]))
  26. throw new AuthException('Group "'.$name.'" already exists in auth');
  27.  
  28. $this->groups[$name] = array();
  29. $this->cursor = $name;
  30. return $this;
  31. }
  32.  
  33. public function addPermission($name)
  34. {
  35. if(!isset($this->perms[$name]))
  36. throw new AuthException('Permission "'.$name.'" not defined');
  37.  
  38. $this->groups[$this->cursor][$name] = $this->perms[$name];
  39. return $this;
  40. }
  41.  
  42. public function __destruct()
  43. {
  44. echo '<br><b>Permisssions:</b> <br>';
  45. echo '<pre>'.print_r($this->perms, 1).'</pre>';
  46. echo '<br><b>Groups:</b> <br>';
  47. echo '<pre>'.print_r($this->groups, 1).'<pre>';
  48. }
  49. }
  50. ?>


Api dla nadawanie praw i grup wygląda tak:

  1. <?php
  2. try {
  3. $auth = new Auth('newsView');
  4. $auth->define('read', 1);
  5. $auth->define('edit', 1);
  6. $auth->define('write');
  7.  
  8. $auth->addGroup('quest')
  9. ->addPermission('read')
  10.  
  11. $auth->addGroup('moderator')
  12. ->addPermission('read')
  13. ->addPermission('edit')
  14. ->addPermission('write')
  15. } catch(AposException $e)
  16. {
  17. echo $e->getMessage();
  18. }
  19. ?>


No i w moim frameworku akcje wyglądają tak że każda akcja np newsView, newsEdit to osobna klasa w osobnym pliku która dziedziczy klase abstrakcyjną akcji. No i chciałem do tego pliku z akcją dołączyć pomocniczą klase dostępu (newsViewAuth, newsViewEdit) gdzie będzie klasa dziedziczącą klasę autoryzacji do sprawdzania dostępu:

  1. <?php
  2. class NewsViewAuth extends AuthCheck {
  3.  
  4. public function _checkAuth()
  5. {
  6.  $this->groupCheck('quest');
  7. }
  8. }
  9.  
  10. // ... klasa NewsViewAction ...
  11. ?>


W dispatherze który wywołuje obiekt odpowiedniej akcji najpierw sprawdzałbym czy dany użytkownik ma do niej prawa o potem dopiero wywoływał jej obiekt. Niewiem gdzie czymać tablice z grupami i prawami dostępu do odpowiednich akcji no i kiedy je tworzyc. User miałby swoją tablice z prawami zapisaną w bazie i przy logowaniu zapisze ją do $_SESSION['security'] smile.gif
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.