2010-06-12 11 views
5

Obecnie jestem po prostu za pomocą czegoś takiego w DB tabeli:Jaki jest skuteczny sposób na stworzenie systemu uprawnień?

access: home,register,login 

A potem na każdej stronie:

if(!Functions::has_rights('content')) 
{ 
    Functions::noAccess(); 
} 

tam jest bardziej efektywny sposób to zrobić z php & MySQL? Mogę chcieć uzyskać dostęp nawet do kilku części na stronie, na przykład użytkownik może czytać stronę, ale nie komentuje jej i nie chcę budować oddzielnego systemu dla każdego modułu.

Odpowiedz

3

Wierzę, czego szukasz jest Access Control List gdzie można modelować swój problem na dwie rzeczy: obiektów i role.

Nie chcę, aby go nałożyć, ale za pomocą ramy jest skuteczny wierzę, Zend Framework zapewnia, że ​​mają wygląd here

Można również szukać alternatyw dla „PHP ACL”, w this SO question.

+0

Zend_Acl to jedyny ZF, którego używam na jednej z moich stron i jest cudowny.Jeśli nie chcesz przejść przez teorię ACLness, aby dowiedzieć się więcej na jej temat (co często lubię robić), bardzo polecam ją tam upuścić. – Hans

3

Zbudowałem go za pomocą systemu uprawnień "* NIX".

Mam różne rodzaje uprawnień dla strony (czytać, modyfikować, usuwać, komentować, głosować), a każdemu z nich przypisać nieco.

Tak na przykład mam

define ('USER_CANREAD', 1); 
define ('USER_CANMODIFY', 2); 
define ('USER_CANDELETE', 4); 
define ('USER_CANINSERT', 8); 
define ('USER_CANCOMMENT', 16); 
define ('USER_CANVOTE', 32); 

Następnie jeśli użytkownik może czytać, komentować i głosować uprawnienie będzie 1 + 16 + 32 = 49

Aby sprawdzić uprawnienia po prostu zrobić bitowe I z tymi wartościami.

Na przykład user->permissions & USER_CANDELETE aby sprawdzić, czy użytkownik może usunąć stronę (oczywiście mam canDelete funkcję dla tego)

1

Jeśli używasz jakiegoś routingu będzie sensu dokonać ACL (lista kontroli dostępu) zależy od zdefiniowanego routingu.

Zwykle uruchamiam z tabelą uprawnień i tabelami uprawnień użytkownika w relacji HABTM. W ten sposób, gdy routing jest zgodny, można wyszukać pozwolenie. Jeśli użytkownik nie ma uprawnień, odmawia mu dostępu. Można to poprawić, sprawdzając różne typy metod GET, POST, PUT i DELETE.

Dzieje się tak, ponieważ podoba mi się możliwość edycji uprawnień i ustawień z poziomu interfejsu internetowego i umożliwienia innym osobom dokonania tego samego (np. Marketingowcy).

Oto układ:

+-----------------------+ 
| permissions   | 
+-----------------------+ 
| id | pattern | method | 
+-----------------------+ 
| 1 |   | GET | # => Will hit the root of your application 
| 2 | users  | GET | # => Will hit users/, usually listing the users 
| 3 | users  | PUT | # => Will hit anyone trying to insert a new user into the system. 
| 4 | users/:id | GET | # => Will hit anyone who tries to view a specific user 
| 5 | users/:id | POST | # => Will hit anyone trying to update a user 
+-----------------------+ 

+-------------------------+ 
| permissions_users  | 
+-------------------------+ 
| user_id | permission_id | 
+-------------------------+ 
| 1  | 1    | # => Will allow to view the root of the application 
| 1  | 2    | # => Will allow to view the users list 
+-------------------------+ 

więc użytkownik 1 nie ma żadnych praw, które mogłyby wpłynąć na zmianę zapisów. A ponieważ routing określa, gdzie znajdują się różne metody żądania, nie można po prostu POST do/użytkowników, aby wyświetlić listę.

Powiązane problemy