Heroku에 Spring Boot Java 앱이 배포되어 있습니다. 내 등록 엔드 포인트가 https로만 액세스 할 수 있는지 확인하고 싶습니다. 지금까지 내가 알고있는 heroku는 특수 헤더 (X-forwarded-porto)를 사용하여 모든 https 연결을 http로 리디렉션하는로드 밸런서를 사용합니다. Iam 사용
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 등을 반환 할 수 있습니다. 나는 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) { ... }
실제로 나는이 repo https://github.com/fenrirx22/springmvc-https-enforcer 에서 해결책을 찾았습니다 .
2 개의 클래스 생성 :
@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
}
}
매력처럼 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다