![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 258 Pomógł: 17 Dołączył: 22.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
Pracuję nad systemem do zarządzania firmą, który nie będzie sprzedawany w pudełku, ale każdy chętny będzie sobie mógł założyć konto i w obrębie jego pracować (dostęp przez www).
Implikuje to nałożenie ograniczeń do zasobów, tak aby user z firmy X nie mógł przeglądać dokumentów z firmy Y. Dotychczas poprzednicy napisali w tym celu sporo metod rozrzuconych po modelach i kontrolerach - ogólnie lekki burdel. Chciałbym trochę tego posprzątać i tę logikę przenieść do "warunkowych ACLi" np
Czy ktoś podziela taki pomysł (może powinienem zrobić ankietę)? Podobno poprzednicy to byli prawdziwi ninja i zastanawiam się czy przypadkiem nie próbuję wynaleźć koła na nowo. -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa ![]() |
Do tego acl raczej nie będzie potrzebny.
Jeśli wszystko jest oparte o bazę danych to sprawdzaj czy user należy do danej firmy jeśli tak może przeglądać i pobierać dane. A ACL daj aby ustalić co konkretnie może przeglądać no i czy może dodawać, edytować, kasować. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 258 Pomógł: 17 Dołączył: 22.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Jeśli wszystko jest oparte o bazę danych to sprawdzaj czy user należy do danej firmy jeśli tak może przeglądać i pobierać dane. Oto właśnie chciałem zapytać - gdzie najlepiej to sprawdzić? Przecież user może sobie spokojnie zmienić w linku www.blebleble.pl/x/y/z/doc_id/7 na np www.blebleble.pl/x/y/z/doc_id/8 ACL wg Ciebie powinien to puścić ponieważ user ma prawo do przeglądania, edycji, etc. dokumentów Teraz w modelu dokumentu należałoby dodać jakieś metody które sprawdzają czy user może przeglądać, edytować, usuwać, wysyłać etc. Mnóstwo sprawdzania zależnego od kontekstu usera, na dodatek trzeba by taką metodę (canEdit, canDelete) wywoływać ręcznie i tu każdy może sie pomylić (albo co gorsza zapomnieć). Nie ma ciekawszych rozwiązań? Niekoniecznie opartych o ACLe -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
Problem spory i zależy od reszty architektury systemu.
Ogólnie: kontroler powinien zapytać model czy dany użytkownik może wykonać jakąś operację. Więc model powinien mieć interfejs udostępniający możliwość sprawdzenia tego dostępu i to jest chyba jasne. Natomiast najważniejsza kwestia jak model powinien sprawdzać czy jest dostęp. Próbowałem stworzyć podobny system do Twojego (niestety bardziej rozbudowany) i chyba się udało, więc Zend_ACL się nadaje. Ma moim zdaniem jest w nim parę niekonsekwencji (ale to moja interpretacja). Zdecydowanie dla użytkowników i np. dokumentów nie tworzyłbym tekstowych ról i zasobów tylko skorzystałbym z Zend_Acl_Role_Interface i Zend_Acl_Resource_Interface. Wtedy w CompanyAssertion dostajesz do sprawdzenia obiekt użytkownika i obiekt zasobu dzięki czemu sprawnie możesz pobrać od użytkownika i dokumentu firmę i wtedy porównać. Czyli coś takiego:
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 4.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Tu jest bardzo dobrze wytłumaczone o czym mówił @destroyerr: http://alex-tech-adventures.com/developmen...assertions.html
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 258 Pomógł: 17 Dołączył: 22.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ogólnie: kontroler powinien zapytać model czy dany użytkownik może wykonać jakąś operację. Czyli trochę przez analogię powinienem zapytać miotłę zanim ją użyję czy mogę ja użyć? To nie model miotły ale jakiejś zmutowanej super miotły. Ja myślałem zrobić to trochę inaczej
Wszystko (nie jest to jakaś strasznie skomplikowana logika) odbywa się w pluginie, żaden controller nie musi być odpalony. Kwestia roli (księgowa, sprzątaczka, etc) jest zabezpieczona przez regułki ACLa, dodatkowy assert tylko sprawdza czy dokument należy do firmy usera. //Dellas Dzięki za linka - trochę podobne do tego co napisałem powyżej. Tak kilka uwag na szybko. 1. Definicja formularza w zend_form od 1.8 ma być nie w konstruktorze, ale w init() 2. Zend_Auth w metodzie authenticate() posiada juz kod
więc powtarzanie go w AuthenticationControllerze jest niepotrzebne. 3. Nie bardzo rozumiem jak ustawiany jest "$comment" przekazywany do CommentAssertion.php ani Id ani modelu tego obieku w kodzie nie widze ;( Tobie udało sie to rozgryźć? Ten post edytował mrok 31.10.2010, 20:58:39 -------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa ![]() |
Tak po najniższej linii oporu można by ten ACL załatwić jednym zapytaniem
query('select * form documents where firma_id = ?', $_SESSION['user_firma_id'] ); I dopiero dla delete czy update sprawdzać w jakiś innych tabelach czy user jest w grupie ADMIN ew. czy w tabeli user_acl ma INSERT_DOC , UPDATE_DOC itd. Jednak to już bym wyjął po za klasę operacji na tabeli documents. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 5 Dołączył: 13.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
dokument jest przypisany do uzutkownika/firmy, przy czytaniu sprawdzasz czy zalogowany chce czytac wlasny dokument, tak samo z kasowaniem itp sprawami.
acla bym w to nie mieszal |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
Cytat przy czytaniu sprawdzasz czy zalogowany chce czytac wlasny dokument Mam wrażenie, że autor wie co ma sprawdzać, a pyta o to "gdzie i jak?". Ja jednak będę polecał Acl. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 05:21 |