2017-11-09 26 views
0

に続いて、jsonへのリクエストを変更するために投稿をthisに投稿しました。SpringセキュリティでのJSONリクエストOAuth2がtomcat 9

私の構成

フィルタ:

@Component 
@Order(value = Integer.MIN_VALUE) 
public class JsonToUrlEncodedAuthenticationFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 
      ServletException { 
     if (Objects.equals(request.getContentType(), "application/json") && Objects.equals(((RequestFacade) request).getServletPath(), "/oauth/token")) { 
      InputStream is = request.getInputStream(); 
      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

      int nRead; 
      byte[] data = new byte[16384]; 

      while ((nRead = is.read(data, 0, data.length)) != -1) { 
       buffer.write(data, 0, nRead); 
      } 
      buffer.flush(); 
      byte[] json = buffer.toByteArray(); 

      HashMap<String, String> result = new ObjectMapper().readValue(json, HashMap.class); 
      HashMap<String, String[]> r = new HashMap<>(); 
      for (String key : result.keySet()) { 
       String[] val = new String[1]; 
       val[0] = result.get(key); 
       r.put(key, val); 
      } 

      String[] val = new String[1]; 
      val[0] = ((RequestFacade) request).getMethod(); 
      r.put("_method", val); 

      HttpServletRequest s = new MyServletRequestWrapper(((HttpServletRequest) request), r); 
      chain.doFilter(s, response); 
     } else { 
      chain.doFilter(request, response); 
     } 
    } 

    @Override 
    public void destroy() { 
    } 
} 

リクエストラッパー:上記の設定は、春ブーツ組み込みのTomcatで動作している

public class MyServletRequestWrapper extends HttpServletRequestWrapper { 
    private final HashMap<String, String[]> params; 

    public MyServletRequestWrapper(HttpServletRequest request, HashMap<String, String[]> params) { 
     super(request); 
     this.params = params; 
    } 

    @Override 
    public String getParameter(String name) { 
     if (this.params.containsKey(name)) { 
      return this.params.get(name)[0]; 
     } 
     return ""; 
    } 

    @Override 
    public Map<String, String[]> getParameterMap() { 
     return this.params; 
    } 

    @Override 
    public Enumeration<String> getParameterNames() { 
     return new Enumerator<>(params.keySet()); 
    } 

    @Override 
    public String[] getParameterValues(String name) { 
     return params.get(name); 
    } 
} 

。 残念ながら、私はフィルタをデバッグするときにTomcat 9.0.1で働いて、その一度の値を取得していないのと、その再びルーピング、次回その取得エラー

ERRORのboot.webそこから、のdoFilter()に通過します.support.ErrorPageFilter - 転送例外のため 要求【/ OAuthの/トークン]から[による エンドの入力にマッピングするコンテンツ]ページをエラーなしする

JSONにその原因が第二のために存在しませんspringbootを使用すると2回目のループに入りません。

springbootだけでなく、スタンドアロンのtomcatでも動作するようにするための提案。

+0

この質問は、どのようにSpring Securityに関連していますか?これはSpring Boot、Servlet、Tomcatに関する質問です。 – dur

答えて

0

問題が 'springSecurityFilterChain'

のための複製フィルタ登録しました。 春ブーツが最初に一度起動し、私のコードも

AbstractSecurityWebApplicationInitializer.class

trouble.Afterはそれを取り除く原因

、春ブーツでその作業などを拡張し、手動でspringSecurityFilterChainを登録しようスタンドアローンの風袋でも同様です。

関連する問題