【问题标题】:Spring security, allow only https connection and send error otherwiseSpring 安全,只允许 https 连接,否则发送错误
【发布时间】:2019-03-04 11:19:21
【问题描述】:
我有一些 REST 服务,根据要求,调用者只能通过 https 调用它们:在每次尝试使用 http 时,必须通过发回自定义的 json 错误响应来拒绝请求。
在 Spring Security 中,我不知道如何实现这种行为......我唯一能做的就是包含这个配置:
.and().requiresChannel().anyRequest().requiresSecure()
但结果是一个透明的重定向,尽管可以接受并且可能“正确”,但不满足要求。
有什么想法吗?提前致谢!
【问题讨论】:
标签:
rest
redirect
spring-security
https
【解决方案1】:
处理您的请求的默认ChannelProcessor 是SecureChannelProcessor,它使用执行重定向的RetryWithHttpsEntryPoint。相反,为默认处理器提供您自己的入口点:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//...
http.requiresChannel().anyRequest().requiresSecure()
.channelProcessors(
Arrays.asList(mySecureChannelProcessor())
);
}
}
@Bean
public ChannelProcessor mySecureChannelProcessor() {
SecureChannelProcessor defaultProcessor = new SecureChannelProcessor();
defaultProcessor.setEntryPoint(new SendHttpsError());
return defaultProcessor;
}
}
public class SendHttpsError implements ChannelEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response) {
// send error
}
}
如果您使用的是 Spring Boot,您可以 @Autowire 默认创建的 ObjectMapper 实例(如果 Jackson 在类路径上)并将其提供给您的入口点。