Обычно в Spring Framework текущий пользователь получается примерно таким кодом:
1 2 |
UserInfo userInfo = SecurityContextHolder.getContext() .getAuthentication().getPrincipal(); |
Однако в контроллерах можно получать текущего пользователя в качестве параметра метода. Для этого нам нужно создать свою аннотацию, которая будет аннотирована аннотацией org.springframework.security.web.bind.annotation.AuthenticationPrincipal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package yourpackage; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.security.web.bind.annotation.AuthenticationPrincipal; @Target({ ElementType.PARAMETER, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @AuthenticationPrincipal public @interface CurrentUser { } |
Затем в конфигурации Spring MVC добавить строки, которые будут заполнять параметры контроллеров текущим пользователем:
1 2 3 4 5 6 |
<mvc:annotation-driven conversion-service="applicationConversionService"> <mvc:argument-resolvers> <bean class="org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver" /> </mvc:argument-resolvers> </mvc:annotation-driven> |
Как видите здесь мы просто добавили AuthenticationPrincipalArgumentResolver в секцию argument-resolver.
Теперь мы можем помечать параметры методов контроллера, которые обрабатывают запросы с помощью @RequestMapping, нашей аннотацией @CurrentUser, и они будут заполнены текущим экземпляром класса с описанием залогиненного пользователя Spring Security. Пример:
1 2 3 4 5 6 7 |
@RequestMapping(value = "createSite", method = RequestMethod.POST, produces = "text/html") public String createSite(@CurrentUser UserDetailsImpl userDetailsImpl, @RequestParam String name, Model uiModel, HttpServletRequest httpServletRequest) { // userDetailsImpl - текущий пользователь. //... } |
Для инжекта UserDetailsImpl можно использовать стандартную аннотацию @AuthenticationPrincipal. @CurrentUser не нужна
Что за инжект?
Можно. Но можно и свою, как здесь:
https://docs.spring.io/autorepo/docs/spring-security/4.1.1.RELEASE/apidocs/org/springframework/security/web/method/annotation/AuthenticationPrincipalArgumentResolver.html