heroku:spring boot仅使用https访问端点

时间:2016-03-30 12:25:19

标签: java spring heroku

我在heroku上部署了一个Spring Boot java应用程序。我想确保我的注册端点只能通过https访问。到目前为止,我已经知道,heroku使用负载均衡器,它将每个https连接重定向到带有特殊标头(X-forwarded-porto)的http。 我用

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,很难找到使用它的任何参考。尝试了谷歌发现的一些事情,但它没有工作(或者我不知道如何正确实施它们......)。我仍然可以通过带邮递员的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 个答案:

答案 0 :(得分:5)

实际上我已经在这个回购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
    }
}

像魅力一样工作。