Spring Security には、認証がプリンシパルであるという前提があります。
public interface Authentication extends Principal, Serializable {}
HttpServletRequest には、プリンシパル オブジェクトへのアクセスを担当するgetUserPrincipalのメソッドがあります。
このケースを考えてみましょう:
public interface RealPrincipal extends Principal {
public Integer getId();
}
共通モジュール A には、Real Principal インターフェイスと実装があります。
モジュール A は、共通モジュール A、サーブレット API を使用し、Spring Security に依存しません。
モジュール B は、共通モジュール A、サーブレット Api を使用し、Spring Security を構成します。このモジュールは、セキュリティと UserDetails の実装を担当します。
Web A はモジュール A とモジュール B を使用します。
リクエスト メソッドを使用するために、次のような実装になります。
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}
これにより、モジュール A およびその他のモジュールの Spring Security に依存する必要があります。適切なサーブレット API の抽象化は、Spring セキュリティに依存すべきではないと考えています。request.getUserPrincipal は実際のプリンシパルを返す必要があります。
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper が返される理由を説明してください
の代わりに認証Real Principal
。
編集:共通モジュール A をシナリオに追加し、モジュール B がセキュリティを担当することを更新しました。