[Symfony][SF3], Voters |
[Symfony][SF3], Voters |
5.01.2017, 11:03:43
Post
#1
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Hejka, zalozmy ze mam 20 roznych Entity. Dla kazdej Entity chce stworzyc Voter by zarzadzac co kto moze kasowac/edytowac/itp.
Tak wiec tworze 20 voters, rejestruje je jako service.Wszystko dziala wysmienicie ale jest jedno ale. Symfony tworzy wszystkie 20 obiektow voters dla kazdego request, nie wazne czy ja zamierzam z nich korzystac czy nie. Poczytalem troche, ok, rozumiem czemu. Nie mniej jednak nie podoba mi sie, iz za kazdym razem tworzy mi te 20 obiektow nawet jak nie potrzebuje ani jednego z nich. Oczywiscie moge latwo ograniczyc, by one nic nie sprawdzaly jak nie ma potrzeby wiec nie beda mi obciazac aplikacji zbednymi wyliczeniami ale sam fakt, ze sa one tworzone bez sensu mnie irytuje. No i pytanie: czy powinieniem sie poprostu nie irytowac i olac to i zostawic jak jest czy moze powininiem cos zrobic? Przykladowo mysle nad takim rozwiazaniem, ze tworze i rejestruje tylko jeden uniwersalny voter dla wszystkich Entity i w przypadku gdy bedzie żądanie sprawdzenia praw dla jakiejs Entity to dopiero wtedy bede ladowal wlasciwy voter dla tej entity jako zwykly niezarejestrowany obiekt. Jak wy to robicie u siebie? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
5.01.2017, 11:15:43
Post
#2
|
|
Grupa: Zarejestrowani Postów: 618 Pomógł: 143 Dołączył: 22.12.2010 Ostrzeżenie: (0%) |
A nie myślałeś nad użyciem/przetestowaniem takiego: https://symfony.com/doc/current/service_con...y_services.html ?
|
|
|
5.01.2017, 11:27:48
Post
#3
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
To nie zadziala w przypadku voters, gdyz dla nich mechanizm jest taki, ze symfony laduje wszystkie voters jakie sa by moc realizowac swoja wewnetrzna polityke.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
5.01.2017, 12:05:56
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
To samo zaproponowal poprzednik.
Ale zrozumcie, ze symfony w przypadku voters ma taki mechanim ze laduje je wszystkie bo musi ladowac by realizowac swoje cele. Symfony nie wie jaki voter bede potrzebowal. Symfony laduje wszystkie voter i to votery wiedza czy maja obslugiwac dana akcje czy nie. Dlatego nie da sie tu uzyc LAZY service -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
5.01.2017, 13:12:51
Post
#5
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) |
Cytat Jak wy to robicie u siebie? Mnie to nie irytuje, ten mechanizm jak dla mnie jest ok. Zastanów się czy nie możesz w takim wypadku stworzyć bardziej ogólnego votera. |
|
|
5.01.2017, 13:23:10
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat Zastanów się czy nie możesz w takim wypadku stworzyć bardziej ogólnego votera. Moglbym, ale wowczas trace te przejrzystosc: Jedno Entity -> Jeden Voter do zarzadzaniaCytat Mnie to nie irytuje, ten mechanizm jak dla mnie jest ok. Ja po prostu strasznie nie lubie tworzyc obiektow, ktorych nie bede uzywal. Ja wiem, ze te kolejne "20" obiektow to cale nic w porownaniu do tego ile Symfony tworzy obiektow po drodze nie mniej mnie to irytuje bo to kolejne "20" obiektow tworzonych na daremno -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
5.01.2017, 15:08:08
Post
#7
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) |
Ja po prostu strasznie nie lubie tworzyc obiektow, ktorych nie bede uzywal. Symfony stoi w przeciwieństwie do tego stwierdzenia -------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
5.01.2017, 15:56:53
Post
#8
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) |
Cytat Moglbym, ale wowczas trace te przejrzystosc: Jedno Entity -> Jeden Voter do zarzadzania Nie wiem jak wygląda Twój kod, ale jak to ma się do zasady DRY? |
|
|
5.01.2017, 17:07:59
Post
#9
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat ale jak to ma się do zasady DRY? Czemu uwazasz ze bede sie powtarzal?Dla jednej Entity moge miec jedna zasade a dla innej inna. A dla tych dla ktorych bede mial te same zasady mam klase bazowa Tylko jak jakas Entity bedzie sie chciala wylamac to wtedy bedzie sobie dziedziczyc po tej klasie i nadpisywac uprawnienia/meotdy ktore chce miec po swojemu. Ja bardzo lubie DRY i staram sie byc z nim na Ty Cytat Symfony stoi w przeciwieństwie do tego stwierdzenia A jak stoi do tego Laravel?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
6.01.2017, 11:45:31
Post
#10
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) |
Może jestem w błędzie i nie masz powtórzeń w kodzie, ale votery (zakładam, że mówimy o klasach a nie obiektach) dla każdej encji budzą takie podejrzenia. Ty widzisz swój kod i jak mówisz, że nie masz powtórzeń to spoko, mogę spać spokojniej.
|
|
|
6.01.2017, 12:12:33
Post
#11
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat ale votery (zakładam, że mówimy o klasach a nie obiektach) dla każdej encji budzą takie podejrzenia przyklady z dokumentacji Symfony wskazuja dosc jasno, ze dla kazdej Entity ma byc oddzielny Voter, co raczej jest dosc logiczne.Nie zmienia to jednak faktu, że mozna napisac jeden bazowy voter, z ktorego inne w razie potrzeby beda korzystac. Ja ostatecznie zrobilem jak pisalem na poczatku: mam jeden voter na wszystkie Entity, ktore to voter realizuje ogolne sprawdzanie praw, ktore dla wielu Entity bedzie takie samo. Ten jeden voter rejestruje w services jako wlasnie voter by symfony go ladowalo. Do tego, jesli jakas Entity bedzie wymagac wlasnych oddzielnych praw, tworze Voter specjalnie dla niej, ale nie rejestruje juz go w services jako entity. Ten jeden glowny Voter sprawdza, czy istnieje voter dla danej entity. Jak nie, to robi swoje ogolne rzeczy, jak tak, to laduje ten specjalny voter dla danej Entity i przekazuje sprawdzanie temu specjalnemu Voter. Dzieki temu mam uniwersalnosc ale i w razie potrzeby specyficznosc i mam DRY - tak wiec spij spokojnie -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
10.01.2017, 04:55:29
Post
#12
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
A jakbyś spróbował ogać to na Interface'ach?
W praktyce, interesuje Cię czy dana encja (czy dowolny inny model - tutaj akurat na plus, bo metody możesz współdzielić o ile implementujesz Interface / extedujesz jakiś base-abstract). Przeważnie masz dość prosty warunek, taki jak sprawdzanie czy... no nie wiem... chociażby "createdBy" to obecnie zalogowany user, ograć to Interface'em, dać voter do sprawdzania "IS_CREATOR" i weryfikować support dać na wcześniej wspomniany Interface. Możesz też podbić priorytet przy rejestrowaniu serwisu, w praktyce nie rozwiąże to Twojego problemu, ale tyle o ile (o ile często weryfikujesz ów warunki) przyspieszysz nieco ten proces (nieco - pewnie jakieś atomowe części sekundy ). Poza tym, w voterze możesz odpalać inne votery Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface @security.access.decision_manager - tak jakbyś kiedyś szukał -------------------- Cytat There is a Bundle for that Lukas Kahwe Smith - October 31th, 2014 |
|
|
10.01.2017, 10:09:49
Post
#13
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat Przeważnie masz dość prosty warunek, taki jak sprawdzanie czy... no nie wiem... chociażby "createdBy" to obecnie zalogowany user, ograć to Interface'em, dać voter do sprawdzania "IS_CREATOR" i weryfikować support dać na wcześniej wspomniany Interface. Jest to tez jakies rozwiazanie. Teraz robie to sprawdzanie w ogolnym voterze. Fakt, mozna przeniesc to do entity implementujacej interfejs. Musze sie z tym przespac Cytat Poza tym, w voterze możesz odpalać inne votery Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface @security.access.decision_manage Ale by to zrobic musze mu przekazac te inne votery czyli musze jest stworzyc. Nie widze sensu. Teraz w moim rozwiazaniu tworze obiekt votera jesli taki specyficzny isntieje i odpalam jego sprawdzanie. Nie widze sensu pakowac to jeszcze w ten DecisionManager skoro wszystko mam pod reka -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
10.01.2017, 10:29:23
Post
#14
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Ale by to zrobic musze mu przekazac te inne votery czyli musze jest stworzyc. Nie widze sensu. Teraz w moim rozwiazaniu tworze obiekt votera jesli taki specyficzny isntieje i odpalam jego sprawdzanie. Nie widze sensu pakowac to jeszcze w ten DecisionManager skoro wszystko mam pod reka Inaczej nie sprawdzisz (logicznie) warunku, czy user jest np Adminem. Z poziomu kontrolera, robisz to przeważnie ->isGranted('ROLE_ADMIN'). poza tym, możesz też mieć dynamiczne role, zależne od posiadanych relacji (np user w grupie ma w standardzie rolę ROLE_{NAZWA_GRUPY}) itd. itp. - do bardziej złożonych kwestii. -------------------- Cytat There is a Bundle for that Lukas Kahwe Smith - October 31th, 2014 |
|
|
10.01.2017, 10:57:41
Post
#15
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat Inaczej nie sprawdzisz (logicznie) warunku, czy user jest np Adminem. Ja wiem. Poprostu nie widze sensu w moim ogolnym voter inicjalizowac na nowo ten manager dla danej specyficznej entity podczasy gdy ten specyficzyny voter tak czy siak mam pod reka -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
10.01.2017, 11:46:44
Post
#16
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
Zawsze możesz stworzyć votera, który wywołuje tylko niezbędne votery / obiekty sprawdzające uprawnienia
-------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
10.01.2017, 12:21:07
Post
#17
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat Zawsze możesz stworzyć votera, który wywołuje tylko niezbędne votery / obiekty sprawdzające uprawnienia No wlasnie tak teraz mam Cytat Ja ostatecznie zrobilem jak pisalem na poczatku: mam jeden voter na wszystkie Entity, ktore to voter realizuje ogolne sprawdzanie praw, ktore dla wielu Entity bedzie takie samo. Ten jeden voter rejestruje w services jako wlasnie voter by symfony go ladowalo.
Do tego, jesli jakas Entity bedzie wymagac wlasnych oddzielnych praw, tworze Voter specjalnie dla niej, ale nie rejestruje juz go w services jako entity. Ten jeden glowny Voter sprawdza, czy istnieje voter dla danej entity. Jak nie, to robi swoje ogolne rzeczy, jak tak, to laduje ten specjalny voter dla danej Entity i przekazuje sprawdzanie temu specjalnemu Voter -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 00:31 |