Często to, co wyświetla się użytkownikowi (np. Na stronie internetowej), będzie częściowo oparte na kontroli bezpieczeństwa. Zazwyczaj uważam bezpieczeństwo na poziomie użytkownika / ACL za część logiki biznesowej systemu. Jeśli widok wyraźnie sprawdza zabezpieczenia w celu warunkowego wyświetlania elementów interfejsu użytkownika, czy narusza MVC poprzez zawieranie logiki biznesowej?
web-development
design-patterns
security
mvc
Matt S.
źródło
źródło
Odpowiedzi:
Mogą istnieć dwa typy warunków bezpieczeństwa, jeden w modelu, a drugi w widoku. Widok kontroluje wyświetlanie odpowiednich elementów w zależności od uprawnień bieżącego użytkownika, ale model kontroluje dostęp do podstawowych danych. Tak długo, jak model ma wszystkie odpowiednie weryfikacje / walidacje, nawet jeśli brakuje widoku, nadal istnieje bezpieczeństwo.
Zwykle musisz mieć jedno i drugie, ponieważ widok musi się zmienić dla różnych poziomów / ról. Kontroler wysyła odpowiednie dane, które zmieniłyby widok, ale widok nadal musi coś zrobić z tymi danymi, aby ukryć / wyświetlić zawartość właściwemu użytkownikowi.
Właśnie dlatego większość ram szablonów ma elementy warunkowe ( przykład kierownicy ):
Oznacza to, że nie stanowi to naruszenia, o ile odpowiednie elementy znajdują się we właściwym miejscu.
źródło
Tak i nie.
Jeśli widok podejmuje właściwą decyzję bezpieczeństwa, to tak, naruszasz MVC. Jeśli jednak widok deleguje rzeczywistą decyzję do modelu, to nic ci nie jest. Nie ma nic złego w widoku podejmowania decyzji, które elementy pokazać, na podstawie informacji z modelu.
Na przykład, jeśli masz przycisk „edytuj”, który jest widoczny tylko dla użytkowników z uprawnieniami „redaktora”, możesz zapytać model, kto jest bieżącym użytkownikiem i czy ma on uprawnienia „redaktora”, używając tych informacji, aby zdecydować, czy wyświetlić przycisk, czy nie. Jeśli jednak widok miałby wykonywać logikę uwierzytelniania i autoryzacji, naruszyłbyś MVC.
źródło
Powiedziałbym „ nie” .
Ale z innego powodu niż powiedział @rvcoutinho (choć cytuje wikipedię, co sprawia, że źle się czuję)
Powiedziałbym, że wszelkie istotne obawy dotyczące bezpieczeństwa powinny być podzielone przez Model podany dla widoku (w zależności od liczby kombinacji, z których możesz chcieć użyć ViewModel z tego powodu), ponieważ możesz mieć przełączniki dla bitów bezpieczeństwa.
Pozwala to na weryfikację bezpieczeństwa dwuwarstwowego: w warstwie interfejsu użytkownika, w przypadku normalnego przypadku, informacje zwrotne są odwracane, a także w warstwie serwerowej w przypadku złych aktorów, w których model utrzymuje w sobie wiedzę o bezpieczeństwie, więc kontroler przekazuje informacje do model, który natychmiast go odrzuca.
Takie dwuwarstwowe zabezpieczenia są standardem w branży, a dzięki temu logika bezpieczeństwa musi istnieć tylko w dwóch miejscach, więc jest to bonus, gdy tylko umieścisz logikę bezpieczeństwa w kontrolerze, umieścisz ją tam i w Interfejs użytkownika i model (model potrzebuje go, ponieważ jest to ostatnia linia obrony i jest szczególnie ważny do wszelkich zastosowań poza tą aplikacją internetową MVC, takich jak klient stacjonarny lub dowolne narzędzia do zarządzania serwerem)
źródło
Powiedziałbym „ nie” .
Zazwyczaj tego rodzaju kontrole bezpieczeństwa przeprowadzane są przez kontrolera.
Z Wikipedii :
I nie sądzę, że należy to zrobić bezpośrednio w widoku. Na przykład, jeśli odbywa się to za pomocą javascript, może to stanowić problem bezpieczeństwa (można wyłączyć javascript i uzyskać dostęp do uprzywilejowanych danych).
Znów z Wikipedii :
źródło
Istnieje kilka problemów związanych z tym pytaniem.
if model.userCanEdit() ... endif
.źródło
Jeśli chodzi tylko o wyświetlanie elementu interfejsu użytkownika, myślę, że jest w porządku (jak inaczej byś to zrobił?). Jeśli w tych elementach byłyby jakieś dane, model powinien upewnić się, że pojemniki są puste. I oczywiście kod, aby uzyskać dane uprawnień, powinien był zostać przetworzony przed widokiem, więc tutaj nie ma aktywnego dostępu do modelu.
źródło
Tak, jest to naruszenie MVC.
Widok służy tylko do wyświetlania elementów, a logika powinna znajdować się w modelu. Umożliwiając widokowi zrobienie czegoś (w twoim przypadku sprawdź bezpieczeństwo), umieszczasz tam logikę.
źródło