W odpowiedzi na twoje pierwsze pytanie, największym problemem ze sprawdzeniem, czy użytkownik ma rolę, a nie konkretne uprawnienia, jest to, że uprawnienia mogą być przechowywane przez wiele ról. Na przykład programista może mieć dostęp do portalu dla deweloperów w intranecie firmy, co prawdopodobnie jest również pozwoleniem posiadanym przez jego menedżera. Jeśli użytkownik próbuje uzyskać dostęp do portalu dla deweloperów, masz czek podobny do:
if(SecurityUtils.hasRole(developer)) {
// Grant them access to a feature
} else if(SecurityUtils.hasRole(manager)) {
// Grant them access to a feature
} else if...
( switch
Wypowiedź w wybranym przez Ciebie języku byłaby lepsza, ale nadal niezbyt uporządkowana)
Im bardziej powszechne lub powszechnie posiadane jest uprawnienie, tym więcej ról użytkowników należy sprawdzić, aby upewnić się, że ktoś może uzyskać dostęp do danego systemu. Doprowadziłoby to również do problemu polegającego na tym, że za każdym razem, gdy modyfikujesz uprawnienia do roli, musisz zmodyfikować czek, aby to odzwierciedlić. W dużym systemie bardzo szybko stałoby się to niewygodne.
Jeśli po prostu sprawdzisz, czy użytkownik ma uprawnienia, które zezwalają mu na przykład na dostęp do portalu dla programistów, nie ma znaczenia, jaką rolę pełnią, zostanie mu przyznany dostęp.
Aby odpowiedzieć na drugie pytanie, masz role, ponieważ działają one tak łatwo, jak modyfikować i dystrybuować „pakiety” uprawnień. Jeśli masz system, który ma setki ról i tysiące uprawnień, dodanie nowego użytkownika (na przykład nowego menedżera HR) wymagałoby przejścia przez użytkownika i przyznania mu każdego pozwolenia, które posiadają inni menedżerowie HR. Byłoby to nie tylko uciążliwe, ale również podatne na błędy, gdyby wykonano je ręcznie. Porównaj to z prostym dodaniem roli „HR manager” do profilu użytkownika, który zapewni mu taki sam dostęp jak każdy inny użytkownik z tą rolą.
Możesz argumentować, że możesz po prostu sklonować istniejącego użytkownika (jeśli twój system to obsługiwał), ale chociaż daje to użytkownikowi odpowiednie uprawnienia na ten moment, próba dodania lub usunięcia uprawnienia dla wszystkich użytkowników w przyszłości może być trudny. Przykładowym scenariuszem jest sytuacja, w której być może w przeszłości personel HR był również odpowiedzialny za płace, ale później firma staje się wystarczająco duża, aby zatrudnić pracowników specjalnie do obsługi listy płac. Oznacza to, że dział HR nie musi już uzyskiwać dostępu do systemu płac, aby zezwolenie można było usunąć. Jeśli masz 10 różnych członków HR, musisz ręcznie przejść i upewnić się, że usunąłeś odpowiednie uprawnienie, które wprowadza możliwość błędu użytkownika. Innym problemem jest to, że po prostu nie skaluje się; w miarę zdobywania coraz większej liczby użytkowników w danej roli znacznie utrudnia to modyfikację roli. Porównaj to z użyciem ról, w których wystarczy zmodyfikować nadrzędną rolę, o której mowa, aby usunąć uprawnienie, co będzie odzwierciedlone przez każdego użytkownika, który pełni tę rolę.