Spring Security: Проверете дали потребителят има роля в Java

1. Въведение

В Spring Security понякога е необходимо да проверите дали удостоверен потребител има конкретна роля. Това може да бъде полезно за активиране или деактивиране на определени функции в нашите приложения .

В този урок ще видим различни начини за проверка на потребителските роли в Java за Spring Security.

2. Проверка на потребителската роля в Java

Spring Security предоставя няколко начина за проверка на потребителските роли в Java кода . Ще разгледаме всеки от тях по-долу.

2.1. @PreAuthorize

Първият начин да проверите за потребителски роли в Java е да използвате анотацията @PreAuthorize, предоставена от Spring Security. Тази анотация може да се приложи към клас или метод и тя приема единична стойност, която представлява израз SpEL.

Преди да можем да използваме тази анотация, първо трябва да активираме глобалната защита на метода. Това може да се направи в Java код чрез добавяне на анотацията @EnableGlobalMethodSecurity към всеки клас на конфигурация.

След това Spring Security предоставя два израза, които можем да използваме с анотацията @PreAuthorize за проверка на потребителските роли:

@PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/user/{id}") public String getUser(@PathVariable("id") String id) { ... }

Също така можем да проверим множество роли в един израз:

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')") @GetMapping("/users") public String getUsers() { ... }

В този случай заявката ще бъде разрешена, ако потребителят има някоя от посочените роли.

Ако методът се извика, без да има правилната роля, Spring Security изхвърля изключение и пренасочва към страницата за грешка.

2.2. SecurityContext

Следващият начин да проверим за потребителски роли в Java кода е с класа SecurityContext .

По подразбиране Spring Security използва локално копие на този клас. Това означава, че всяка заявка в нашето приложение има своя контекст на сигурност, който съдържа подробности за потребителя, отправящ заявката .

За да го използваме, ние просто извикваме статичните методи в SecurityContextHolder :

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) { ... }

Имайте предвид, че тук използваме обикновеното име на орган вместо пълното име на ролята.

Това работи добре, когато се нуждаем от по-фини проверки - например конкретна част от един метод. Въпреки това, този подход няма да работи, ако използвате режима на глобалната титуляр контекст през пролетта на сигурност .

2.3. UserDetailsService

Третият начин, по който можем да търсим потребителски роли в Java кода, е чрез използване на UserDetailsService . Това зърно можем да инжектираме навсякъде в нашето приложение и да го извикаме при необходимост:

@GetMapping("/users") public String getUsers() { UserDetails details = userDetailsService.loadUserByUsername("mike"); if (details != null && details.getAuthorities().stream() .anyMatch(a -> a.getAuthority().equals("ADMIN"))) { // ... } }

Отново тук трябва да използваме името на властта, а не пълното име на роля с префикс.

Предимството на този подход е, че можем да проверяваме ролите за всеки потребител , а не само за този, който е направил заявката.

2.4. Заявка за сървлети

Ако използваме Spring MVC, можем също да проверим потребителските роли в Java с помощта на класа HttpServletRequest :

@GetMapping("/users") public String getUsers(HttpServletRequest request) { if (request.isUserInRole("ROLE_ADMIN")) { ... } }

3. Заключение

В тази статия видяхме няколко различни начина за проверка на ролите, използвайки Java код с Spring Security.

Както винаги, примерите за кодове от тази статия могат да бъдат намерени в GitHub.