서문 : Spring-Security 3.2 이후 @AuthenticationPrincipal
로이 답변의 끝에 멋진 주석 이 있습니다. 이것은 Spring-Security> = 3.2를 사용할 때 가장 좋은 방법입니다.
때를:
- 이전 버전의 Spring-Security를 사용하십시오.
- 주체에 저장된 일부 정보 (예 : 로그인 또는 ID)로 데이터베이스에서 사용자 정의 사용자 개체를로드해야합니다.
- 방법을 배우고 싶어
HandlerMethodArgumentResolver
하거나 WebArgumentResolver
우아한 방법으로이 문제를 해결하거나 뒤에 배경을 배울 수있는 단지 원하는 수 @AuthenticationPrincipal
와 AuthenticationPrincipalArgumentResolver
(그것이 기반으로하기 때문에 HandlerMethodArgumentResolver
)
그런 다음 계속 읽으십시오. 그렇지 않으면 @AuthenticationPrincipal
Rob Winch (저자 @AuthenticationPrincipal
)와 Lukas Schmelzeisen (자신의 답변) 에게 감사의 말씀을 전 합니다.
(BTW : 제 답변은 조금 더 오래되었으므로 (2012 년 1 월) Spring Security 3.2에 주석 솔루션 기반을 가진 최초의 사람으로 등장한 것은 Lukas Schmelzeisen 이었습니다 @AuthenticationPrincipal
.)
그런 다음 컨트롤러에서 사용할 수 있습니다
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}
한 번 필요하면 괜찮습니다. 그러나 인프라 세부 정보로 컨트롤러를 오염시키기 때문에 추악한 일이 여러 번 필요한 경우 일반적으로 프레임 워크에 의해 숨겨져 야합니다.
따라서 실제로 원하는 것은 다음과 같은 컨트롤러를 갖는 것입니다.
public ModelAndView someRequestHandler(@ActiveUser User activeUser) {
...
}
따라서을 구현하기 만하면 WebArgumentResolver
됩니다. 방법이 있습니다
Object resolveArgument(MethodParameter methodParameter,
NativeWebRequest webRequest)
throws Exception
웹 요청 (두 번째 매개 변수)을 가져 와서 User
메소드 인수 (첫 번째 매개 변수)에 대한 책임이 있다고 생각되면 if 를 반환해야합니다 .
Spring 3.1부터라는 새로운 개념이 HandlerMethodArgumentResolver
있습니다. Spring 3.1 이상을 사용한다면 그것을 사용해야한다. (이 답변의 다음 섹션에 설명되어 있습니다)
public class CurrentUserWebArgumentResolver implements WebArgumentResolver{
Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
if(methodParameter is for type User && methodParameter is annotated with @ActiveUser) {
Principal principal = webRequest.getUserPrincipal();
return (User) ((Authentication) principal).getPrincipal();
} else {
return WebArgumentResolver.UNRESOLVED;
}
}
}
사용자 정의 어노테이션을 정의해야합니다. 모든 사용자 인스턴스가 항상 보안 컨텍스트에서 가져와야하지만 명령 오브젝트가 아닌 경우이를 무시할 수 있습니다.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ActiveUser {}
구성에서는 다음을 추가하기 만하면됩니다.
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
id="applicationConversionService">
<property name="customArgumentResolver">
<bean class="CurrentUserWebArgumentResolver"/>
</property>
</bean>
@See : Spring MVC @Controller 메소드 인자를 커스터마이징하는 법 배우기
Spring 3.1을 사용하는 경우 WebArgumentResolver보다 HandlerMethodArgumentResolver를 권장합니다. -Jay의 코멘트보기
HandlerMethodArgumentResolver
Spring 3.1 이상 과 동일
public class CurrentUserHandlerMethodArgumentResolver
implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return
methodParameter.getParameterAnnotation(ActiveUser.class) != null
&& methodParameter.getParameterType().equals(User.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
if (this.supportsParameter(methodParameter)) {
Principal principal = webRequest.getUserPrincipal();
return (User) ((Authentication) principal).getPrincipal();
} else {
return WebArgumentResolver.UNRESOLVED;
}
}
}
구성에서 이것을 추가해야합니다
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="CurrentUserHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
@Spring MVC 3.1 HandlerMethodArgumentResolver 인터페이스 활용
스프링 보안 3.2 솔루션
Spring Security 3.2 (Spring 3.2와 혼동하지 마십시오)에는 자체 솔루션이 내장되어 있습니다 : @AuthenticationPrincipal
( org.springframework.security.web.bind.annotation.AuthenticationPrincipal
). 이것은 Lukas Schmelzeisen의 답변 에 잘 설명되어 있습니다.
그냥 쓰고 있어요
ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {
...
}
이 작업을 수행하려면 "활성화" 하거나이 Bean을 등록하여 위의 Spring 3.1 솔루션에서 설명한 것과 같은 방식으로 AuthenticationPrincipalArgumentResolver
( org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver
) 를 등록해야합니다 .@EnableWebMvcSecurity
mvc:argument-resolvers
@Spring Security 3.2 Reference, 11.2 장을 참조하십시오. Auth
스프링 시큐리티 4.0 솔루션
그것은 봄 3.2 솔루션처럼 작동하지만, 봄 4.0에서 @AuthenticationPrincipal
와 AuthenticationPrincipalArgumentResolver
타 패키지에 "이동"되었다 :
(그러나 이전 패키지에있는 이전 클래스는 여전히 존재하므로 혼합하지 마십시오!)
그냥 쓰고 있어요
import org.springframework.security.core.annotation.AuthenticationPrincipal;
ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {
...
}
이 작업을 수행하려면 "활성화" 하거나이 Bean을 등록하여 위의 Spring 3.1 솔루션에서 설명한 것과 같은 방식으로 ( org.springframework.security.web.method.annotation.
) 를 등록해야합니다 .AuthenticationPrincipalArgumentResolver
@EnableWebMvcSecurity
mvc:argument-resolvers
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
@Spring Security 5.0 참조 서, 39.3 장 @AuthenticationPrincipal 참조