如何在Spring Boot应用程序的管理端口上禁用安全性?

时间:2015-12-15 13:17:25

标签: java spring-security spring-boot

我正在建立一个Spring Boot 1.3安全应用程序,但是有一个公众无法访问的管理端口,所以我不需要这个端口的任何安全性。

这就是我想要实现的目标:

server.port = 8080     # -> secure
management.port = 8081 # -> unsecure

但是只要我添加一个WebSecurityConfigurerAdapter,它就会自动对两个端口都有效。如果管理端口不同,设置management.security.enabled=false无效,这是一个错误吗?我怎样才能禁用管理端口的安全性?

我的简单安全配置:

@Configuration
@EnableWebSecurity
static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }
}

我知道可能的解决方法可能是设置自定义上下文路径,例如。 /manage并且忽略了安全性的这条路径,但使用非标准路径加上摆弄安全配置的路径而不进行硬编码似乎并不理想,所以我想找到是否有一个标准的方法。

2 个答案:

答案 0 :(得分:1)

看起来它实际上是一个错误:https://github.com/spring-projects/spring-boot/issues/4624

答案 1 :(得分:0)

您始终可以添加请求匹配器,并跳过管理端口的安全检查。 Spring Boot 2的解决方法如下。这也可能适用于较旧的Spring Boot版本。请尝试看看。

public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

   // this is the port for management endpoints
   @Value("${management.server.port}")
   private int managementPort;

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
            .authorizeRequests()
            .requestMatchers(checkPort(managementPort)).permitAll()
            .anyRequest().authenticated();

   }

  /**
   * This method verifies whether a request port is equal to the provided method parameter
   *
   * @param port Port that needs to be checked with the incoming request port
   * @return Returns a request matcher object with port comparison
   */
   private RequestMatcher checkPort(final int port) {
       return (HttpServletRequest request) -> port == request.getLocalPort();
   }
}

this answer的启发。