2012-10-22 17 views
8

Używam Symfony2 i mam już użytkowników i role już zapisane w moim DB. Jeżeli ustawić coś jak poniżej w security.yml działa świetnie:Jak przechowywać informacje Symfony2 "access_control" w bazie danych?

access_control: 
    - { path: ^/admin, role: ROLE_ADMIN} 
    - { path: ^/users, role: ROLE_MANAGER} 

Ale chciałbym przechowywać informacje access_control w bazie danych, dzięki czemu użytkownik z mojego systemu może sama zmienić uprawnienia za pomocą interfejsu administracyjnego.

Spojrzałem na ACL i FOSUserBundle, ale nie mogłem znaleźć rozwiązania. Zauważyłem, że mogę sprawdzić uprawnienia z czymś takim jak if ($user->hasRole($role)), ale musiałbym to zrobić w każdym kontrolerze.

Czy istnieje sposób zdefiniowania dynamicznej funkcji "access_control"? Może coś takiego jak przekierowanie access_control do jakiejś klasy, która może zwrócić true lub false. Jakieś rozwiązanie?

Odpowiedz

5

Najlepszym sposobem byłoby ustawienie określonej roli (np. DB_ROLE_CHECK) ustawionej w działaniach/usługach, które mają być sprawdzone względem ról przechowywanych w bazie danych.

Następnie należy utworzyć wyborca ​​bezpieczeństwa, który podpina pod numer DB_ROLE_CHECK i sprawdza poprawność żądania w odniesieniu do wpisów w bazie danych.

Patrz:

+0

Dzięki, działało idealnie! –

+0

Nie dostałem tego. Gdzie muszę umieścić rolę DB_ROLE_CHECK w hierarchii ról i jak sprawdzić trasę w Wyborcy? Na przykład mam pozycje DB, takie jak [route, role]. I w regule access_control^/: DB_ROLE_CHECK, prawda? Wykona więc DBVoter na każde żądanie. W atrybucie $ będę miał rolę, a następnie token $. I będę miał trasę lub ścieżkę jako $ subject param? Więc potrzebuję uzyskać rekord DB według ścieżki i użyć jego roli z $ user z tokena $ w menadżerze decyzyjnym, prawda? –

3

Mapa dostępu jest zbudowany here.

Jeśli nie zostanie wykryte żadne polecenie access_control, nic nie zostanie zrobione.

Teraz należy zdefiniować własną implementację parametru AccessMapInterface i zastąpić parametr security.access_map.class swoją klasą.

Prawdopodobnie będziesz potrzebować fabryki do zbudowania mapy AccessMap.

+1

Próbuję to zrobić, ale proszę, jak mogę przesłonić parametr security.access_map.class? Próbowałem umieścić to w security.yml: security: access_map: class: CRM \ CoreBundle \ Security \ DBAccessMap –

Powiązane problemy