Wpis z mikrobloga

[ #symfony2 #symfony #php ]

Mam:
- FOS + grupy
w FOS mam: role: ROLEUSER i ROLEADMIN

co chcę osiągnąć:

www.example.com/strona/nazwastrony1
www.example.com/strona/nazwastrony2
www.example.com/strona/nazwastrony3
itd...

teraz potrzebuję zrobić tak, aby odpowiednia grupa miała dostęp tylko do strony1, inna grupa miała dostęp do strony2 itd...

jak to zrobić?
Sprawdzać za każdym razem przed wyświetleniem strony w kontrolerze klasy czy użytkownik posiada grupę która pozwala na wyświetlanie danej strony?
Jak zdefiniować która grupa ma dostęp do strony1, która do strony2 itd?
  • 11
@qwelukasz: Nie decydujesz na podstawie grup, tylko na podstawie ról. Grupy traktuj jedynie jako kolekcje ról, czyli np grupa nauczyciel może posiadać role uczy + wystawia_oceny + sprawdza_liste_obecnosci.

Wtedy jak masz wielu nauczycieli, przydzielasz ich do grupy i wszyscy zyskują ten zestaw ról. Jak potem chcesz zmienić masowo uprawnienia nauczycieli, to modyfikujesz tylko role przypisane do grupy, a nie role dla każdego nauczyciela z osobna.

----

Natomiast samo sprawdzanie uprawnień
@MacDada: hmm, czyli na podstawie tego co piszesz to musiałbym zdefiniować 7 ról (po role na stronie) i wtedy z tego stworzyć grupy i przypisywać użytkownikom daną grupę która posiada zestaw ról..

czyli w moim przypadku byłoby to:
grupa 1: ROLESITE1
grupa 2: ROLESITE2
i tak dalej i tak dalej przy czym
grupaALL może posiadać ROLESITE1, ROLESITE2...

jak sprawdzać jakie role posiada
@MacDada: dlatego zastanawiam się jak zrobić to w ten sposób aby to administrator mógł decydować jaka grupa/rola odpowiada za jakąś stronę/kanał... bo inaczej przy dodawaniu kolejnej pozycji
example.com/101 będę musiał ręcznie w kodzie definiować 101 ról co jest bez sensu...
@qwelukasz: bo rozumiem że role sprawdzam tak:

accesscontrol:
- { path: ^/blog/admin/update|details, roles: ROLE
ADMIN }
- { path: ^/blog/admin, roles: ROLEMODERATOR }
więc potem musiałbym dodawać:

- { path: ^/blog/sites/0, roles: [ROLE
SITE1, ROLESITE2, ROLESITE3] }
- { path: ^/blog/sites/1, roles: [ROLE
SITE1] }
- { path: ^/blog/sites/2, roles: [ROLE
SITE2] }
- { path: ^/blog/sites/3, roles: [ROLE
SITE3] }
@qwelukasz: na pewno da się jakoś edytować w locie acl w symfony - potem sobie np zapisujesz to do ramu i do pliku przy edycji, a na starcie aplikacji wczytujesz to z pliku do ramu i tyle
- { path: ^/blog/sites/0, roles: [ROLE_SITE_1, ROLE_SITE_2, ROLE_SITE_3] }


@qwelukasz: Możesz użyć annotacji w kontrolerze: http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/security.html

dlatego zastanawiam się jak zrobić to w ten sposób aby to administrator mógł decydować jaka grupa/rola odpowiada za jakąś stronę/kanał...


@qwelukasz: Jest wiele opcji:

1. Pełen ACL: każdy kanał reprezentujesz jako obiekt i przy pomocy ACL opisujesz kto ma dostęp do niego.
2. Każdy kanał to rola, którą przypisujesz użytkownikom (lub grupom użytkowników)
3.
Czym są „strony/kanały”?


@MacDada:
Najprościej rzecz ujmując. Są przez API pobierane dane bilingowe z różnych systemów.
Każdy użytkownik ma mieć dostęp do tego samego zestawu danych (np. bilingi, płatności, faktury, itp..) ale z innego systemu.
Czyli:
Pobieram bilingi i faktury z play.pl i to jest example.com/1
Pobieram bilingi i faktury z tmobile i to jest example.com/2

Admin ma dostęp do example.com/0..99 czyli może zobaczyć łączne sumy jak i poszczególne dane.
Uzytkownik
@qwelukasz: No to dostawców telefonii masz kilku(nastu) – skąd więc ma być ich 101?

Tzn wyjaśniłeś do czego mają mieć użytkownicy dostęp – a nie „dlaczego” – inaczej mówiąc co decyduje, że akurat użytkownik „A” ma dostęp do kanału „7”? Jak reprezentujesz kanał? Skąd wiesz, co ma się pokazać po wejściu na /7? To jest jakiś obiekt w bazie? Jakaś konfiguracja?

Inaczej mówiąc: od czego Ty chcesz, żeby było uzależnione
@MacDada: dostawcy to akurat przykład :)

inaczej mówiąc co decyduje, że akurat użytkownik „A” ma dostęp do kanału „7”?


@MacDada: Administrator. On decyduje kto ma widzieć jakie dane.

Skąd wiesz, co ma się pokazać po wejściu na /7?


@MacDada: będzie to rekord gdzie kolumna 'kanał' będzie miała ID 7. ID będzie obiektem przekazywanym jako parametr i na tej podstawie ładował określone dane z bazy.

W takim wypadku chyba faktycznie