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

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

1. обзор

Эта статья покажет, какretrieve the user details in Spring Security.

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

Дальнейшее чтение:

Отслеживайте зарегистрированных пользователей с помощью Spring Security

Краткое руководство по отслеживанию зарегистрированных пользователей в приложении, созданном с использованием Spring Security.

Read more

Spring Security - роли и привилегии

Как сопоставить роли и привилегии для приложения Spring Security: настройка, аутентификация и процесс регистрации.

Read more

Spring Security - сбросьте свой пароль

Каждое приложение должно позволять пользователям менять свой пароль на случай, если они его забудут.

Read more

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

Самый простой способ получить аутентифицированного в данный момент принципала - это статический вызов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. Получите пользователя в контроллере

В аннотированном bean-компоненте@Controller есть дополнительные параметры. The principal can be defined directly as a method argument, и он будет правильно разрешен фреймворком:

@Controller
public class SecurityController {

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

В качестве альтернативыwe can also use the authentication token:

@Controller
public class SecurityController {

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

API классаAuthentication очень открытый, поэтому фреймворк остается максимально гибким. Из-за этогоthe Spring Security principal can only be retrieved as an Object and needs to be cast to the correct UserDetails instance:

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

И, наконец, непосредственноfrom the HTTP request:

@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 beans, нам нужно скрыть статический доступ за простым фасадом:

public interface IAuthenticationFacade {
    Authentication getAuthentication();
}
@Component
public class AuthenticationFacade implements IAuthenticationFacade {

    @Override
    public Authentication getAuthentication() {
        return SecurityContextHolder.getContext().getAuthentication();
    }
}

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

@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

Текущий аутентифицированный участникcan also be accessed in JSP pages, используя поддержку библиотеки тегов безопасности spring. Сначала нам нужно определить тег на странице:

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

Далее мы можемrefer to the principal:


    authenticated as 

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

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

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


    org.thymeleaf.extras
    thymeleaf-extras-springsecurity5


    org.thymeleaf
    thymeleaf-spring5

Теперьwe can refer to the principal in the HTML page using the sec:authorize attribute:



    
Authenticated as

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

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

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

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