Рубрики
Без рубрики

Получение информации о пользователе в Spring Security

В этой статье будет показано, как получить сведения о пользователе в Spring Security.

Автор оригинала: Sravan Cynixit.

1. Обзор

В этой статье будет показано, как получить сведения о пользователе в Spring Security. В настоящее время аутентифицированный пользователь доступен через ряд различных механизмов весной – давайте сначала рассмотрим наиболее распространенное решение – программный доступ.

Если вы хотите Узнать, Как Закрепить Пружину, пожалуйста, пройдите через Тренировка в Весенней Обуви

2. Получите пользователя в бобе

Самый простой способ получить аутентифицированного в данный момент участника-это статический вызов SecurityContextHolder: Начните писать здесь…

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();

Улучшение этого фрагмента заключается в том, чтобы сначала проверить, есть ли аутентифицированный пользователь, прежде чем пытаться получить к нему доступ:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof AnonymousAuthenticationToken)) {
    String currentUserName = authentication.getName();
    return currentUserName;
}

Конечно, у такого статического вызова есть свои недостатки – снижение тестируемости кода является одним из наиболее очевидных. Вместо этого мы рассмотрим альтернативные решения для этого очень распространенного требования.

3. Поместите пользователя в контроллер

В компоненте с аннотацией @Controller есть дополнительные опции. Принципал может быть определен непосредственно как аргумент метода, и он будет правильно разрешен платформой:

@Controller
public class SecurityController {
 
    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserName(Principal principal) {
        return principal.getName();
    }
}

В качестве альтернативы мы также можем использовать маркер аутентификации:

@Controller
public class SecurityController {
 
    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserName(Authentication authentication) {
        return authentication.getName();
    }
}

API класса аутентификации очень открыт, так что структура остается максимально гибкой. Из-за этого принцип безопасности Spring может быть получен только в виде объекта и должен быть приведен к правильному экземпляру UserDetails:

UserDetails userDetails = (UserDetails) authentication.getPrincipal();
System.out.println("User has authorities: " + userDetails.getAuthorities());

И, наконец, непосредственно из HTTP-запроса:

@Controller
public class GetUserWithHTTPServletRequestController {
 
    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserNameSimple(HttpServletRequest request) {
        Principal principal = request.getUserPrincipal();
        return principal.getName();
    }
}

4. Получите пользователя через пользовательский интерфейс

Чтобы в полной мере использовать внедрение зависимостей Spring и иметь возможность получать аутентификацию везде, а не только в компонентах @Controller, нам нужно скрыть статический доступ за простым фасадом:

public interface IAuthenticationFacade {
    Authentication getAuthentication();
}
@Component
public class AuthenticationFacade implements IAuthenticationFacade {
 
    @Override
    public Authentication getAuthentication() {
        return SecurityContextHolder.getContext().getAuthentication();
    }
}

Фасад предоставляет объект аутентификации, скрывая статическое состояние и сохраняя код разделенным и полностью проверяемым:

@Controller
public class GetUserWithCustomInterfaceController {
    @Autowired
    private IAuthenticationFacade authenticationFacade;
 
    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserNameSimple() {
        Authentication authentication = authenticationFacade.getAuthentication();
        return authentication.getName();
    }
}

5. Получите пользователя в JSP

К текущему аутентифицированному участнику также можно получить доступ на страницах JSP, используя поддержку spring security taglib. Во-первых, нам нужно определить тег на странице:

<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>

Далее мы можем обратиться к основному:


    authenticated as  

6. Получите пользователя в Thymeleaf

Thymeleaf-это современный серверный движок веб-шаблонов с хорошей интеграцией с платформой Spring MVC. Давайте посмотрим, как получить доступ к текущему аутентифицированному участнику на странице с движком Thymeleaf.

Во-первых, нам нужно добавить зависимости thymeleaf-spring 5 и thymeleaf-extras-spring security 5 для интеграции Thymeleaf с Spring Security:


    org.thymeleaf.extras
    thymeleaf-extras-springsecurity5


    org.thymeleaf
    thymeleaf-spring5

Теперь мы можем ссылаться на принципала на HTML-странице, используя атрибут sec:authorize:



    
Authenticated as

7. Вывод

В этой статье показано, как получить информацию о пользователе в приложении Spring, начиная с общего механизма статического доступа, а затем несколькими лучшими способами внедрения принципала.

Реализацию этих примеров можно найти в проекте GitHub – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть. Когда проект выполняется локально, HTML-код домашней страницы можно получить по адресу:

http://localhost:8080/spring-security-rest-custom/foos/1

Оригинал: “https://www.codementor.io/@sravancynixit/retrieve-user-information-in-spring-security-14arwu8ub0”