¿Cómo puedo decirle a Spring Security que aplique authorizeRequests solo para un puerto específico?

Configuramos nuestro nuevo micro servicio (usando Spring-Boot) de manera que la API oficial esté en el puerto 8080 (que se asigna fuera de nuestra red virtual a HTTPS normal en el puerto 443), mientras que algunas funciones de administración están en un HTTP secundario puerto 7979. Estos solo se usan dentro de la red virtual, y se usan para monitoreo, balanceo de carga, etc.

Todo el acceso a la API debe asegurarse con OAuth, mientras que las funciones de administración deben ser accesibles libremente dentro de la red. Así que configuramos la seguridad de Spring de esta manera (http es un objeto HttpSecurity):

    http
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
        .and()
        .authorizeRequests()
            .antMatchers("/info").anonymous()
            .antMatchers("/health").anonymous()

            .antMatchers(HttpMethod.GET, "/warehouses/**").access(oauthScopeRead)
            .antMatchers(HttpMethod.PUT, "/warehouses/**").access(oauthScopeWrite)

            .anyRequest().denyAll();

Esto tiene el efecto en ambos puertos: /infoy /healthno están autorizados, aunque /warehousesnecesitan autenticación, y todo lo demás también necesita autenticación (devuelve 401, pero cuando se invoca con autenticación, devuelve 403).

Como no hay /infoo /healthen el puerto público, estos devuelven 404 para usuarios no autorizados, mientras que todo lo demás devuelve 401. No estoy satisfecho con esto y me gustaría tener

  • en el puerto público, requiere autenticación para todo (y devuelve 404 o 403 solo después de ser autenticado)
  • en el puerto de administración, no requiere autenticación en absoluto (devuelva 404 para todo lo que no sea uno de los puntos finales configurados).

No pude encontrar nada sobre puertos en los documentos Java Security Spring o en la documentación de referencia .

Que puedo hacer aqui

Respuesta 1

Una forma sencilla de permitir todo el acceso a los puntos finales de administración, independientemente del puerto en el que se ejecuten:

http.authorizeRequests()
    .requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll();

El método org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest # toAnyEndpoint devuelve una coincidencia que solo coincide con las solicitudes del actuador.

Ver spring-boot-samples para un ejemplo más completo.

Respuesta: 2

Los predicados de guayaba no se pueden usar como filtro con la API de transmisión de Java 8. Por ejemplo, esto no es posible: Number first = numbers.stream () .filter (com.google.common.base.Predicates ....

¿Alguien sabe si la API para Java EE Connector versión 1.6 se encuentra en algún repositorio Maven? Como parece que no puedo encontrarlo. Si es posible, con código fuente y / o javadoc sería muy ...

Estoy usando Java 8 Esto es lo que parece mi ZonedDateTime 2013-07-10T02: 52: 49 + 12: 00 Obtengo este valor como z1.format (DateTimeFormatter.ISO_OFFSET_DATE_TIME) donde z1 es un ZonedDateTime. YO ...

Me encontré con esto en una entrevista en Java anteriormente. Fue una de las únicas preguntas que no pude responder simplemente por falta de familiaridad con la integración de Google Maps. ¿Alguien puede decirme qué ...