2016-05-10 3 views
2

私は、マイクロサービススイートのスプリングブートマイクロサービスに取り組んでいます。サービスエンドポイントは、@PreAuthorizeアノテーションと特別なステートレス認証を提供するカスタムGenericFilterBeanの2つの機能を使用してすべて保護されています。Mockセッションを使用してセキュリティをバイパスする

MockMvcを使って最初にログインURLに投稿し、指定されたエンドポイントから取得する例があります。これは、ログインが別のマイクロサービスによって実行されるため、私の問題です。クッキーは

  • モック偽のクッキーを使用するには、セッションを設定してセッションを取得するために、他のマイクロサービスを介して

    1. ログイン:

      は、私はのように要約することができます完全に理解することなく、さまざまな試みを行っています

    2. MockMvcは、ログインを実行するために外部URLを呼び出すことはできませんので、最初は除外される

    セキュリティとカスタムフィルタを無効にします。セッションを嘲笑してもクッキーを設定することはできません - 私は応答オブジェクトにaddCookieしか表示しません。カスタムフィルタを無効にすると何も起こりません(おそらく私はこれを間違っている)。

    テストする適切な方法は、有効な模擬セッションを用意して、セキュリティをそのまま維持できるようにすることです。私はどのように進行するのか困惑しています。

    春ブート親ポンポンがある:春 - クラウドスターター親 - Brixton.M4

    どのように私は単一のマイクロサービスとバイパスのセキュリティをテストすることができますか?

  • 答えて

    4

    私はしばらく前に同様の問題を持っていたし、それが答えを見つけるために私にいくつかの時間がかかりました、ではない、これはあなたの問題を解決するかどうかわからが、私は次のようなアプローチに

    を使用してmockMvcを使用して認証するように管理することができます認証を担当するクラスを作成します。

    public class Auth { 
    
        @Autowired 
        private WebApplicationContext wac; 
    
        @Autowired 
        private FilterChainProxy springSecurityFilter; 
    
        protected MockMvc mockMvc; 
        protected MockHttpSession session; 
    
        public void setup() throws Exception{ 
         this.session = new MockHttpSession(); 
         this.mockMvc = MockMvcBuilders.webAppContextSetup(wac) 
           .addFilters(springSecurityFilter) 
           .build(); 
        } 
    
        protected void setAuthentication(String user, String password, MockHttpSession session){ 
         Authentication authentication = new UsernamePasswordAuthenticationToken(user, password); 
         SecurityContext securityContext = SecurityContextHolder.getContext(); 
         securityContext.setAuthentication(authentication); 
    
         session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,securityContext); 
        } 
    } 
    

    これで、このクラスを拡張し、メソッドsetAuthenticatioを使用してログインしてテストを実行することができます。たとえば

    public class myTest extends Auth { 
        @Test 
        public void test{ 
         setAuthentication('user', 'password', session); 
         // perform you tests using mockmvc 
         // mockMvc.perform(post('url')... 
    
        } 
    
    } 
    
    +0

    はい - これは私の問題を克服するために正確に働いた!フィルタをデバッグして、プロキシを使用して通常の呼び出しからスクラップする可能性のある署名付きの一連の値を持つヘッダーが必要であることを確認しました。 mockMvc.perform(get( "/")。ヘッダ( "myheader"、 "token"));ありがとうございました! – Kieveli

    関連する問題