Jak sprawdzić uprawnienia lub uprawnienia użytkownika w kodzie Java? Na przykład - chcę pokazać lub ukryć przycisk dla użytkownika w zależności od roli. Istnieją adnotacje takie jak:
@PreAuthorize("hasRole('ROLE_USER')")
Jak to zrobić w kodzie Java? Coś jak :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Piotr Gwiazda
źródło
źródło
SecurityContextHolderAwareRequestWrapper
instancji. Możesz go poprawić, wyjaśniając, jak go uzyskać, i nieco dokładniej wyjaśniając samą odpowiedź.można użyć metody isUserInRole obiektu HttpServletRequest.
coś jak:
źródło
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
z prośbą? :)Zamiast używać pętli do wyszukiwania uprawnień w UserDetails, możesz:
źródło
Możesz pobrać kontekst zabezpieczeń, a następnie użyć go:
źródło
SecurityContextHolder.getContext()
nigdyNULL
, sprawdź dokumentację. W ten sposób można uniknąć sprawdzania bytu kontekstowegoNULL
.Możesz zaimplementować metodę hasRole () jak poniżej - (jest to testowane na zabezpieczeniach sprężynowych 3.0.x nie ma pewności co do innych wersji).
źródło
SecurityContextHolder.getContext().getAuthentication()
można odzyskaćnull
. Może dodasz jakiś czek?Używam tego:
źródło
Możesz uzyskać pomoc od klasy AuthorityUtils . Sprawdzanie roli jako jednoliniowiec:
Uwaga: to nie sprawdza hierarchii ról, jeśli taka istnieje.
źródło
Odpowiedź od JoseK nie może zostać użyta, gdy jesteś w warstwie usług, gdzie nie chcesz wprowadzać sprzężenia z warstwą internetową z odniesienia do żądania HTTP. Jeśli chcesz rozwiązać role w warstwie usług, odpowiedzią Gopi jest droga do zrobienia.
Jednak jest trochę rozwlekły. Dostęp do władz można uzyskać bezpośrednio z poziomu uwierzytelniania. Dlatego jeśli możesz założyć, że masz zalogowanego użytkownika, wykonaj następujące czynności:
źródło
W większości odpowiedzi brakuje niektórych punktów:
Rola i autorytet to nie to samo na wiosnę. Więcej informacji znajdziesz tutaj .
Nazwy ról są równe
rolePrefix
+authority
.Domyślny prefiks roli można
ROLE_
jednak konfigurować. Zobacz tutaj .Dlatego prawidłowe sprawdzenie roli musi uwzględniać prefiks roli, jeśli jest skonfigurowany.
Niestety, dostosowywanie prefiksów ról w Spring jest trochę hakerskie, w wielu miejscach domyślny prefiks
ROLE_
jest zakodowany na stałe, ale oprócz tego fasola typuGrantedAuthorityDefaults
jest sprawdzana w kontekście Spring, a jeśli istnieje, to przedrostek roli niestandardowej jest szanowany.Łącząc wszystkie te informacje, lepszą implementacją narzędzia do sprawdzania ról byłoby coś takiego:
źródło
Co dziwne, nie sądzę, aby istniało standardowe rozwiązanie tego problemu, ponieważ kontrola dostępu zabezpieczeń sprężynowych jest oparta na wyrażeniach , a nie w Javie. możesz sprawdzić kod źródłowy DefaultMethodSecurityExpressionHandler, aby zobaczyć, czy możesz ponownie użyć czegoś, co tam robią
źródło
Lepiej późno, niż nigdy, pozwól, że wrzucę moje 2 centy.
W świecie JSF, w ramach mojej zarządzanej fasoli, wykonałem następujące czynności:
Jak wspomniano powyżej, rozumiem, że można to zrobić w długi, zawiły sposób:
źródło
To trochę zbliża się do pytania z drugiej strony, ale pomyślałem, że dorzuciłem je, ponieważ naprawdę musiałem kopać w Internecie, aby się tego dowiedzieć.
Jest wiele rzeczy na temat sprawdzania ról, ale niewiele mówi się o tym, co sprawdzasz, kiedy mówisz ma rolę („bla”)
HasRole sprawdza przyznane uprawnienia dla aktualnie uwierzytelnionego podmiotu zabezpieczeń
Więc naprawdę, gdy widzisz, że maRole („bla”) naprawdę oznacza mieć autorytet („bla”) .
W przypadku, który widziałem, robisz to z klasą implementującą UserDetails, która definiuje metodę o nazwie getAuthorities. W tym przypadku po prostu dodasz niektóre
new SimpleGrantedAuthority("some name")
do listy w oparciu o jakąś logikę. Nazwy na tej liście to rzeczy sprawdzane przez instrukcje hasRole.Myślę, że w tym kontekście obiekt UserDetails jest obecnie uwierzytelnionym podmiotem. Istnieje pewna magia, która dzieje się w dostawcach uwierzytelniania i wokół nich, a dokładniej w menedżerze uwierzytelniania, który to umożliwia.
źródło
hasRole("bla")
jest to teraz równehasAuthority("ROLE_bla")
.Odpowiedź @gouki jest najlepsza!
Tylko wskazówka, jak naprawdę robi to wiosna.
Istnieje klasa o nazwie,
SecurityContextHolderAwareRequestWrapper
która implementujeServletRequestWrapper
klasę.Do
SecurityContextHolderAwareRequestWrapper
przesłaniaisUserInRole
i łatwość wyszukiwaniaAuthentication
(który jest zarządzany przez wiosnę), aby znaleźć jeśli użytkownik ma swoją rolę, czy nie.SecurityContextHolderAwareRequestWrapper
kod jest następujący:źródło
Te dwie poniższe adnotacje są równe, „hasRole” automatycznie doda przedrostek „ROLE_”. Upewnij się, że masz właściwą adnotację. Ta rola jest ustawiana w UserDetailsService # loadUserByUsername.
następnie możesz uzyskać rolę w kodzie java.
źródło
W naszym projekcie używamy hierarchii ról, podczas gdy większość powyższych odpowiedzi ma na celu jedynie sprawdzenie określonej roli, tj. Sprawdzenie tylko podanej roli, ale nie tej roli i wyżej w hierarchii.
Rozwiązanie tego problemu:
RoleHierarchy jest zdefiniowana jako fasola w spring-security.xml.
źródło
W swoim modelu użytkownika po prostu dodaj metodę „hasRole”, jak poniżej
Zwykle używam go do sprawdzenia, czy uwierzytelniony użytkownik ma rolę administratora w następujący sposób
źródło
Role użytkowników można sprawdzić w następujący sposób:
Używanie metod statycznych wywołania w SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Korzystanie z HttpServletRequest
źródło
My Approach z pomocą Java8, Przekazywanie ról oddzielonych przecinkami da ci prawdę lub fałsz
źródło