1. Обзор
Spring Security обрабатывает получение и анализ учетных данных для проверки подлинности для нас.
В этом коротком уроке мы рассмотрим, как получить Контекст безопасности информацию из запроса в нашем коде обработчика.
2. Аннотация @CurrentSecurityContext
Мы могли бы использовать некоторый шаблонный код для чтения контекста безопасности:
SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication();
Однако теперь есть @CurrentSecurityContext аннотация, которая поможет нам .
Кроме того, использование аннотаций делает код более декларативным и делает объект authentication инъекционным. С помощью @CurrentSecurityContext мы также можем получить доступ к реализации Principal текущего пользователя.
В приведенных ниже примерах мы рассмотрим несколько способов получения данных контекста безопасности, таких как Аутентификация и имя Принципала . Мы также посмотрим, как протестировать наш код.
3. Зависимости Maven
Если у нас есть последняя версия Spring Boot, то нам нужно только включить зависимость для spring-boot-starter-security :
org.springframework.boot spring-boot-starter-security
В противном случае мы можем обновить spring-security-core до минимальной версии 5.2.1.RELEASE:
org.springframework.security spring-security-core 5.2.1.RELEASE
4. Реализация с помощью @CurrentSecurityContext
Мы можем использовать SpEL (язык выражений Spring) с @CurrentSecurityContext для введения объекта Authentication или Principal . Заклинание работает вместе с поиском типов. Проверка типа по умолчанию не выполняется, но мы можем включить ее с помощью параметра error On Invalid Type аннотации @CurrentSecurityContext|/.
4.1. Получение Объекта аутентификации
Давайте прочитаем объект Authentication , чтобы мы могли вернуть его данные:
@GetMapping("/authentication") public Object getAuthentication(@CurrentSecurityContext(expression = "authentication") Authentication authentication) { return authentication.getDetails(); }
Обратите внимание, что выражение SpEL ссылается на сам объект authentication .
Давайте проверим это:
@Test public void givenOAuth2Context_whenAccessingAuthentication_ThenRespondTokenDetails() { ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("read")); OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails); String authentication = executeGetRequest(restTemplate, "/authentication"); Pattern pattern = Pattern.compile("\\{\"remoteAddress\":\".*" + "\",\"sessionId\":null,\"tokenValue\":\".*" + "\",\"tokenType\":\"Bearer\",\"decodedDetails\":null}"); assertTrue("authentication", pattern.matcher(authentication).matches()); }
Мы должны отметить, что в этом примере мы получаем все детали нашего соединения. Поскольку наш тестовый код не может предсказать удаленный адрес или значение токена , мы используем регулярное выражение для проверки результирующего JSON.
4.2. Получение Доверителя
Если нам нужен только Принципал из наших аутентификационных данных, мы можем изменить выражение SpEL и введенный объект:
@GetMapping("/principal") public String getPrincipal(@CurrentSecurityContext(expression = "authentication.principal") Principal principal) { return principal.getName(); }
В этом случае мы возвращаем только имя Principal , используя метод getName .
Давайте проверим это:
@Test public void givenOAuth2Context_whenAccessingPrincipal_ThenRespondBaeldung() { ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("read")); OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails); String principal = executeGetRequest(restTemplate, "/principal"); assertEquals("baeldung", principal); }
Здесь мы видим имя baeldung , которое было добавлено к учетным данным клиента, которое было найдено и возвращено из объекта Principal , введенного в обработчик.
5. Заключение
В этой статье мы рассмотрели, как получить доступ к свойствам в текущем контексте безопасности и ввести их в параметры в наших методах обработчика.
Мы сделали это, воспользовавшись преимуществами SpEL и аннотацией @CurrentSecurityContext .
Как всегда, полный исходный код примеров доступен на GitHub .