Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MVC][CI] Dostęp do zasobu
Forum PHP.pl > Forum > PHP
markonix
Sam nie wiem czy podchodzi do pod ACL ale ogólnie nie czuje potrzeby wydzielania warstwy dostępu dlatego chciałbym w prosty sposób weryfikować czy zalogowany użytkownik może zobaczyć np. dany wpis w bazie.

Przypuszczając, że w sesji mam ID zalogowanego, a wpis w bazie ma kolumnę z właścicielem (twórcą).
Aby utrudnić sprawę przyjmuje, że dostęp do wpisu ma też np. administrator.

No i teraz pytanie jak to kontrolować? Kontroler?
Praktycznie za każdym razem mam jakiś inny pomysł.

Od strony modelu:
Przykładowo gdy tworzę metodę "getWpis" dodaje dodatkowy parametr na ID z wartością domyślną NULL.
Gdy wartość ta nie jest NULL dodaje do zapytania WHERE z weryfikacją autora.
W przypadku gdy metoda jest użyta np. w panelu admina parametru nie przesyłam albo wysyłam NULL.
Sposób jest w miarę ok choć zawsze mam obawy, że jakiś użytkownik wywoła metodę z parametrem NULL - przykładowo gdzieś zapomnę weryfikować czy użytkownik jest zalogowany tym samym brak ID zalogowanego.

Robienie dodatkowej metody weryfikującej czy dany user ma dostęp do zasobu wydaje mi się czasochłonne.

Nie zależy mi na wyświetlaniu wyjątku iż nie ma dostępu do danego wpisu tylko po prostu brak elementu (powyższy sposób spełnia te założenie).

Jakieś porady? (korzystam z CI ale ten problem w sumie wraca dosyć często, nawet z strukturalnych aplikacjach).
nospor
Cytat
Robienie dodatkowej metody weryfikującej czy dany user ma dostęp do zasobu wydaje mi się czasochłonne.

1) Nie wiem co w tym widzisz czasochłonnego.... szybciej by ci poszło napisanie tej metody niż walenie na forum z takim pytaniem.
2) Jest to słuszna metoda
markonix
Jest to czasochłonne ze względu na to, że akurat w aktualnym projekcie jest wiele zbliżonych modeli (nie takich samych oczywiście) i do każdego potrzebowałbym takiej metody. Metoda ta byłaby dość podobna ale znów nie taka sama w każdym modelu stąd chce to jakoś unormować i uprościć.

Nie chce (tzn nie mam konieczności) informowania użytkownika o tym, że nie ma dostępu do danego zasobu.
Przy metodzie "hasRight" mogę też oczywiście zwrócić ten sam widok (błąd), ale zawsze to jedno zapytanie więcej, a efekt ostateczny ten sam.
Do tego +1 instrukcja warunkowa w kontrolerze.

Poza tym przecież opisałem porównanie. Ta prostacka metoda z dodatkowym atrybutem sprowadza się do mniej niż jednej linijki "->where("id", $id)" (ActiveRecords) więc tak - uważam, że taki "lokalny" ACL jest czasochłonny, a w moim projekcie tworzenie tych metod zajmie więcej niż 2 minuty

- czas na napisanie tematu (czasami nie umiem zrozumieć tych Twoich docinek (ogólnie), człowiek chce przedyskutować swoje przemyślenia to dostanie odpowiedź "po co lecisz z tym na forum".... oświeć mnie w takim razie do czego służy te forum?).
nospor
Cytat
czas na napisanie tematu (czasami nie umiem zrozumieć tych Twoich docinek (ogólnie), człowiek chce przedyskutować swoje przemyślenia to dostanie odpowiedź "po co lecisz z tym na forum".... oświeć mnie w takim razie do czego służy te forum?).
Przecież ci udzieliłem, że metoda ta nie jest czasochłonna i że jest to słuszna metoda. W moim poście nie było żadnej docinki, a jedynie porównanie czasu. O co ci chodzi, chłopie? Zadajesz pytanie, dostajesz odpowiedź i jakieś bezsensowne pretensje.... To co, miałem napisać ci: "Tak, tak, jest to czasochłonne, a Twoje kombinowanie jest ok i tak właśnie wszyscy robią"? Tak miałem napisać, wówczas dopiero byś uznał że moja odpowiedź spełnia Twoje kryteria?
markonix
Tylko, że już wyjaśniłem, że porównanie czasowe jest błędne w moim przypadku - metoda w każdym modelu to znacznie (w linijkach kodu to będzie gdzieś 5-10x) więcej wkładu i często kopiowanie zbliżonych metod, co mi się niezbyt widzi.

Zastanawiam się jeszcze nad globalną metodą, która by to weryfikowała. Musiała ona jednak by przyjmować nazwę tabeli i ewentualnie nazwę kolumny (z domyślną wartością, staram się normować tabele aby miały zbliżoną strukturę).

Nie sądzisz, że jakbym tworzył 20 metod hasRight, a potem chciałbym dodać, że prawo ma także globalny administrator to coś tu nie śmierdzi, że musiałbym edytować 20 plików? Toż to nawet nie praca dla IDE.
nospor
Cytat
Tylko, że już wyjaśniłem, że porównanie czasowe jest błędne w moim przypadku - metoda w każdym modelu to znacznie (w linijkach kodu to będzie gdzieś 5-10x) więcej wkładu i często kopiowanie zbliżonych metod, co mi się niezbyt widzi.
Tak, ale wyjaśniłeś mi to dopiero po moim poście, w którym porównywałem czasy. A pretensje do mnie waliłeś właśnie w poście, w którym wyjasniałeś... No nie sądzisz chyba, że patrzę w przyszłość i pisząc odpowiedź kieruję się tym, co mi user napisze w następnym poście?


Ja tak robie jak ci napisałem. Jeśli mam 100 różnych obiektów/modeli, to i do każdego z nich mam rightHandlera. Dzięki temu mam porządek. Do danego obiektu mogę się odwoływać w różnych miejscach ale do sprawdzenia prawa korzystam nadal tylko z jednego rightHandlera. Gdy zmieni mi sie prawo na dany obiekt, to zmieniam to tylko w jednym miejscu a nie w kilku.

Co do globalnego admina: takie rzeczy u mnie są normą, że globalny admin ma prawo i wpisuje to zawczasu w rightHandlera.
Co do ciebie to nic nie stoi na przeszkodzie by twoje handlery dziedziczyły z jakiegoś ogólnego handlera. Wówczas prawo ogólne na ogólnego admina ustawiasz właśnie w tym ogólnym rightHandlerze.

Poza tym przy metodzie co ty preferujesz to zmieniając jakieś prawo dostępu i tak byś musial robić zmiany we wszytkich miesjcach gdzie masz ten SELECT, więc nie wiem czemu używasz to jako argument przeciwko mnie...
markonix
Czy rightHandler to u Ciebie to metoda danego modelu czy oddzielna klasa (i jest ich tyle co modeli)?

Zmiana w dostępie wydaje mi się, że dość szybko będzie konieczna bo niestety są częste zmiany koncepcji.
I właśnie przy takie zmianie zacząłem się zastanawiać nad lepszym rozwiązaniem.

To był argument skierowany jak najbardziej przeciw obu sposobom.
nospor
Cytat
To był argument skierowany jak najbardziej przeciw obu sposobom.
Ok. smile.gif

Każdy rightHandler to oddzielna klasa, która dziedziczy z klasy głównej.
W takiej klasie mam metody np:
CanEdit
CanRemove
CanPreview
itp w zależności od potrzeby. Dzięki temu mam porządek, dzięki temu jak coś się zmienia to wiem, że muszę to zmienić w danej klasie i że po zmianie zostanie łyknięte wszędzie bez zastanawiania w ilu miejscach tego użyłem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.