前文: Spring-Security 3.2以降@AuthenticationPrincipal
、この回答の最後に説明されている素晴らしい注釈があります。これは、Spring-Security> = 3.2を使用する場合に最適な方法です。
あなたが:
- Spring-Securityの古いバージョンを使用し、
- プリンシパルに保存されている情報(ログインやIDなど)によってデータベースからカスタムユーザーオブジェクトをロードする必要がある
- 方法を学びたい
HandlerMethodArgumentResolver
か、WebArgumentResolver
後ろの背景を勉強したいエレガントな方法でこれを解決することができ、またはちょうど@AuthenticationPrincipal
とAuthenticationPrincipalArgumentResolver
(それが基づいているためHandlerMethodArgumentResolver
)
その後、読み続けます—それ以外の場合は@AuthenticationPrincipal
、使用してRob Winch(の作者@AuthenticationPrincipal
)およびLukas Schmelzeisen(彼の回答)に感謝します。
(ところで、私の回答は少し古い(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
これはWebリクエスト(2番目のパラメーター)を取得User
し、メソッドの引数(最初のパラメーター)を担当していると感じた場合はを返す必要があります。
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;
}
}
}
カスタムアノテーションを定義する必要があります。Userのすべてのインスタンスを常にセキュリティコンテキストから取得する必要があるが、コマンドオブジェクトではない場合は、スキップできます。
@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を推奨することに注意してください。-ジェイのコメントを参照
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>
@See Spring MVC 3.1 HandlerMethodArgumentResolverインターフェースの活用
Spring-Security 3.2ソリューション
春のセキュリティは、3.2(春3.2と混同しないでください)溶液中で独自のビルドを持っています@AuthenticationPrincipal
(org.springframework.security.web.bind.annotation.AuthenticationPrincipal
)。これはルーカス・シュメルツァイセンの答えでうまく説明されています
それはただ書いている
ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {
...
}
これは作業を取得するには、登録する必要がありますAuthenticationPrincipalArgumentResolver
(org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver
「活性化」によって、次のいずれか)、 @EnableWebMvcSecurity
または内部にこのBeanを登録してmvc:argument-resolvers
-私は上記の5月の春3.1ソリューションでそれを説明したのと同じ方法を。
@「Spring Security 3.2 Reference、Chapter 11.2」を参照してください。@AuthenticationPrincipal
Spring-Security 4.0ソリューション
それは春3.2ソリューションのように動作しますが、春4.0 @AuthenticationPrincipal
とAuthenticationPrincipalArgumentResolver
他のパッケージに「移動」されました:
(ただし、古いパッケージの古いクラスはまだ存在するため、混在させないでください!)
それはただ書いている
import org.springframework.security.core.annotation.AuthenticationPrincipal;
ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {
...
}
あなたが登録する必要が働いて、これを取得するには(org.springframework.security.web.method.annotation.
)AuthenticationPrincipalArgumentResolver
:いずれかの「活性化」によって、 @EnableWebMvcSecurity
または内このBeanを登録することにより、mvc:argument-resolvers
-私は上記の5月の春3.1ソリューションでそれを説明したのと同じ方法。
<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