Получить информацию о пользователе в Spring Security
1. обзор
Эта статья покажет, какretrieve the user details in Spring Security.
В настоящее время аутентифицированный пользователь доступен в Spring с помощью ряда различных механизмов - давайте сначала рассмотрим наиболее распространенное решение - программный доступ.
Дальнейшее чтение:
Отслеживайте зарегистрированных пользователей с помощью Spring Security
Краткое руководство по отслеживанию зарегистрированных пользователей в приложении, созданном с использованием Spring Security.
Spring Security - роли и привилегии
Как сопоставить роли и привилегии для приложения Spring Security: настройка, аутентификация и процесс регистрации.
Spring Security - сбросьте свой пароль
Каждое приложение должно позволять пользователям менять свой пароль на случай, если они его забудут.
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