2016-03-30 16 views
1

私はherokuに展開されたSpring Boot Javaアプリケーションを持っています。自分の登録エンドポイントにhttpsだけでアクセスできることを確認したい。これまで私が知っていたherokuは、HTTPへのすべてのhttps接続を特別なヘッダ(X-forwarded-porto)でリダイレクトするロードバランサを使用しています。 Iam使用方法heroku:春の起動は、httpsのエンドポイントにのみアクセスします

compile("org.springframework.boot:spring-boot-starter-security") 

暗号化ツール(ハッシングパスワード)用。私は "security.basic.enable"プロパティをfalseに設定しています(この場合、実際にはわかりません)。

はすでにこれらの設定を設定しようとしました:

tomcat: 
    remote_ip_header: x-forwarded-for 
    protocol_header: x-forwarded-proto 

私application.ymlに

を質問は、私が実際には、HTTPSリンクを介して使用するエンドポイントを強制する方法、ありますか? httpの場合、404などを返す可能性があります。私はそれを使用して任意のrefferenceを見つけるためにgradleとちょっと難しいを使用しています。 Googleで見つかったいくつかのことを試しましたが、うまくいかなかった(または正しく実装する方法がわかりません...)。私はまだ郵便配達員とhttpを介して私のエンドポイントにアクセスすることができました。 は今、それは次のようになります。

@Controller 
@RequestMapping("/users") 
public class AccountController { 
    @Autowired 
    private AccountRepository accountDao; 

    @RequestMapping(value = "/register", method = RequestMethod.POST, consumes = "application/json") 
    public ResponseEntity<Resource<Account>> createAccount(@RequestBody @Valid Account account) { ... } 

答えて

2

実は私はこのレポhttps://github.com/fenrirx22/springmvc-https-enforcerに(最終的に)解決策を見つけました。

@Configuration 
public class ApiConfig { 
    @Bean 
    public Filter httpsEnforcerFilter(){ 
     return new HttpsEnforcer(); 
    } 
} 

と::魔法のように

public class HttpsEnforcer implements Filter { 

    private FilterConfig filterConfig; 

    public static final String X_FORWARDED_PROTO = "x-forwarded-proto"; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     this.filterConfig = filterConfig; 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     HttpServletResponse response = (HttpServletResponse) servletResponse; 

     if (request.getHeader(X_FORWARDED_PROTO) != null) { 
      if (request.getHeader(X_FORWARDED_PROTO).indexOf("https") != 0) { 
       response.sendRedirect("https://" + request.getServerName() + request.getPathInfo()); 
       return; 
      } 
     } 

     filterChain.doFilter(request, response); 
    } 

    @Override 
    public void destroy() { 
     // nothing 
    } 
} 

作品

は2クラスを作成しました。

+0

私はその回答に1つの変更を加えます。リダイレクト文字列のリダイレクトでrequest.getPathInfo()をrequest.getPathInfo()== nullに変更しますか? "":request.getPathInfo()は、パス情報が正しくない場合を処理します。 – Ceekay

関連する問題