Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> panel administracyjny w frameworkach
Apo
post
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
nrm
post
Post #2





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Go to the top of the page
+Quote Post
Prph
post
Post #3





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Ludvik
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Apo
post
Post #5





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

Ostrzeżenie: (0%)
-----


@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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 18:49