복붙노트

[SPRING] heroku : https 만있는 엔드 포인트에 대한 봄 부팅 액세스

SPRING

heroku : https 만있는 엔드 포인트에 대한 봄 부팅 액세스

나는 heroku에 전개 된 스프링 부트 자바 애플리케이션을 가지고있다. 내 등록 엔드 포인트에 https에서만 액세스 할 수 있는지 확인하고 싶습니다. 지금까지 내가 알고 있듯이 heroku는 모든 https 연결을 특수 헤더 (X-forwarded-porto)로 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 또는 뭔가를 반환 할 수 있습니다. 나는 그것을 사용하여 어떤 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) { ... }

해결법

  1. ==============================

    1.사실이 Repo https://github.com/fenrirx22/springmvc-https-enforcer에서 해결책을 찾았습니다.

    사실이 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
        }
    }
    

    매력처럼 작동합니다.

  2. from https://stackoverflow.com/questions/36308813/heroku-spring-boot-acces-to-endpoints-with-https-only by cc-by-sa and MIT license