Si Spring Security está en el classpath, luego las aplicaciones web están protegidas de forma predeterminada. Spring Boot se basa en la estrategia de negociación de contenido de Spring Security para determinar si se utiliza httpBasic o formLogin. Para implementar seguridad a nivel de método en su aplicación web, también puede agregar la anotación @EnableGlobalMethodSecurity con la configuración deseada.

UserDetailsService se proporciona para un solo usuario de forma predeterminada. El nombre de usuario es user y la contraseña es aleatoria y se imprime en el nivel WARN cuando se inicia la aplicación, como se muestra en el siguiente ejemplo:

Usando la contraseña de seguridad generada: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35 Esta contraseña generada es solo para uso de desarrollo. Su configuración de seguridad debe actualizarse antes de ejecutar su aplicación en producción.
Si está ajustando su configuración de registro , asegúrese de que la categoría org.springframework.boot.autoconfigure.security esté configurada para registrar mensajes de nivel WARN. De lo contrario, no se muestra la contraseña predeterminada.

Puede cambiar el nombre de usuario y la contraseña especificando spring.security.user.name y spring.security.user.password. .

Las principales funciones que están disponibles por defecto en una aplicación web son las siguientes:

  • El UserDetailsService (o ReactiveUserDetailsService en el caso de una aplicación WebFlux) con almacenamiento en memoria y un usuario con una contraseña generada (para las propiedades del usuario, consulte SecurityProperties.User).

  • Inicie sesión usando formularios o proteja usando HTTP Básico (dependiendo del encabezado Aceptar en la solicitud) para toda la aplicación (incluyendo puntos finales del actuador si el actuador está en classpath).

  • DefaultAuthenticationEventPublisher para publicar eventos de autenticación.

Puede pasar otro AuthenticationEventPublisher agregando un bean para él.

Seguridad para MVC

La configuración de seguridad predeterminada se implementa en SecurityAutoConfiguration y UserDetailsServiceAutoConfiguration. SecurityAutoConfiguration importa SpringBootWebSecurityConfiguration para la seguridad web, y UserDetailsServiceAutoConfiguration configura la autenticación, que también es relevante para aplicaciones no web. Para deshabilitar completamente la configuración de seguridad de la aplicación web predeterminada o combinar múltiples componentes de Spring Security, como el cliente y el servidor de recursos OAuth2, agregue un bean de tipo SecurityFilterChain (con la configuración UserDetailsService o seguridad (la seguridad para Actuator no se desactivará).

Para, entre otras cosas, desactivar la configuración de UserDetailsService, puede agregar un bean como UserDetailsService, AuthenticationProvider o AuthenticationManager.

Las reglas de acceso se pueden anular agregando una SecurityFilterChain o un WebSecurityConfigurerAdapter personalizado frijol. Spring Boot proporciona métodos auxiliares que puede utilizar para anular las reglas de acceso para los puntos finales del actuador y los recursos estáticos. EndpointRequest se puede utilizar para crear un RequestMatcher que se basa en la propiedad management.endpoints.web.base-path. PathRequest se puede utilizar para crear un RequestMatcher para recursos ubicados en ubicaciones de uso frecuente.

Seguridad en WebFlux

Similar a Spring apps MVC, puede proteger sus aplicaciones WebFlux agregando la dependencia spring-boot-starter-security. La configuración de seguridad predeterminada se implementa en ReactiveSecurityAutoConfiguration y UserDetailsServiceAutoConfiguration. ReactiveSecurityAutoConfiguration importa WebFluxSecurityConfiguration para la seguridad web y UserDetailsServiceAutoConfiguration configura la autenticación, que también es relevante para aplicaciones no web. Para deshabilitar completamente la configuración de seguridad predeterminada de la aplicación web, puede agregar un bean como WebFilterChainProxy (esto no deshabilita la configuración de UserDetailsService ni la seguridad del Actuator).

Para deshabilitar también la configuración de UserDetailsService, puede agregar un bean como ReactiveUserDetailsService o ReactiveAuthenticationManager.

Reglas de acceso y uso de múltiples Spring beans La seguridad, como el cliente y servidor de recursos OAuth 2, se puede configurar agregando un bean SecurityWebFilterChain personalizado. Spring Boot proporciona métodos auxiliares que puede utilizar para anular las reglas de acceso para los puntos finales del actuador y los recursos estáticos. EndpointRequest se puede utilizar para crear un ServerWebExchangeMatcher, que se basa en la propiedad management.endpoints.web.base-path.

PathRequest se puede utilizar para crear un ServerWebExchangeMatcher para recursos ubicados en ubicaciones de uso frecuente.

Por ejemplo, puede configurar controles de seguridad agregando algo como:

Java
import org.springframework.boot.autoconfigure.security.reactive.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration(proxyBeanMethods = false)
public class MyWebFluxSecurityConfiguration {
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange((exchange) -> {
            exchange.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll();
            exchange.pathMatchers("/foo", "/bar").authenticated();
        });
        http.formLogin(withDefaults());
        return http.build();
    }
}
Kotlin
import org.springframework.boot.autoconfigure.security.reactive.PathRequest
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.web.server.ServerHttpSecurity
import org.springframework.security.web.server.SecurityWebFilterChain
@Configuration(proxyBeanMethods = false)
class MyWebFluxSecurityConfiguration {
    @Bean
    fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        http.authorizeExchange { spec ->
            spec.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
            spec.pathMatchers("/foo", "/bar").authenticated()
        }
        http.formLogin()
        return http.build()
    }
}

OAuth2

OAuth2 es un sistema de autorización ampliamente utilizado compatible con Spring.

Cliente

Si su classpath tiene spring-security-oauth2-client, puede utilizar algunas funciones de configuración automática para instalar clientes OAuth2/Open ID Connect. Esta configuración utiliza propiedades de OAuth2ClientProperties. Estas mismas propiedades se aplican tanto a los servlets como a las aplicaciones reactivas.

Puede registrar varios clientes y proveedores de OAuth2 con el prefijo spring.security.oauth2.client, como se muestra en el siguiente ejemplo. :

Propiedades

spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization-code
spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
Yaml

spring:
  security:
    oauth2:
      client:
        registration:
          my-client-1:
            client-id: "abcd"
            client-secret: "password"
            client-name: "Client for user scope"
            provider: "my-oauth-provider"
            scope: "user"
            redirect-uri: "https://my-redirect-uri.com"
            client-authentication-method: "basic"
            authorization-grant-type: "authorization-code"
          my-client-2:
            client-id: "abcd"
            client-secret: "password"
            client-name: "Client for email scope"
            provider: "my-oauth-provider"
            scope: "email"
            redirect-uri: "https://my-redirect-uri.com"
            client-authentication-method: "basic"
            authorization-grant-type: "authorization_code"
        provider:
          my-oauth-provider:
            authorization-uri: "https://my-auth-server/oauth/authorize"
            token-uri: "https://my-auth-server/oauth/token"
            user-info-uri: "https://my-auth-server/userinfo"
            user-info-authentication-method: "header"
            jwk-set-uri: "https://my-auth-server/token_keys"
            user-name-attribute: "name"

Para proveedores de OpenID Connect que admiten Descubrimiento de OpenID Connect, la configuración se puede simplificar aún más. El emisor debe configurarse con issuer-uri, que es un URI que agrega una afirmación de que el URI dado es el identificador del emisor. Por ejemplo, si el issuer-uri pasado es "https://example.com", entonces la Solicitud de configuración del proveedor OpenID se realizará en "https://example .com/.well-known/openid-configuration". El resultado esperado es una Respuesta de configuración del proveedor OpenID. El siguiente ejemplo muestra cómo se puede configurar el proveedor OpenID Connect usando issuer-uri:

Propiedades
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
Yaml

spring:
  security:
    oauth2:
      client:
        provider:
          oidc-provider:
            issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"

De forma predeterminada, OAuth2LoginAuthenticationFilter en Spring Security solo procesa las URL correspondientes /login/oauth2/código/*. Si desea configurar redirect-uri para usar una plantilla diferente, debe crear una configuración para manejar esa plantilla. Por ejemplo, para aplicaciones de servlet, puede agregar su propia SecurityFilterChain, que sería similar a lo siguiente:

Java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
public class MyOAuthClientConfiguration {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
        http.oauth2Login((login) -> login.redirectionEndpoint().baseUri("custom-callback"));
        return http.build();
    }
}
Kotlin
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.web.SecurityFilterChain
@Configuration(proxyBeanMethods = false)
class MyOAuthClientConfiguration {
    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        http.authorizeRequests().anyRequest().authenticated()
        http.oauth2Login().redirectionEndpoint().baseUri("custom-callback")
        return http.build()
    }
}
Spring Boot configura automáticamente InMemoryOAuth2AuthorizedClientService, que Spring Security utiliza para administrar los procedimientos de registro de clientes. InMemoryOAuth2AuthorizedClientService tiene una funcionalidad limitada, por lo que recomendamos usarlo solo en entornos de desarrollo. En entornos de producción, utilice JdbcOAuth2AuthorizedClientService o cree su propia implementación de OAuth2AuthorizedClientService.

Registro de clientes OAuth2 para proveedores comunes

Para aplicaciones comunes Proveedores de OAuth2 y OpenID, incluidos Google, Github, Facebook y Okta, proporcionamos un conjunto de proveedores predeterminados (google, github, facebook y okta, respectivamente).

Si no necesita configurar estos proveedores, puede configurar el atributo provider para aquel para el que desea mostrar valores predeterminados. Además, si la clave de registro del cliente coincide con un proveedor compatible predeterminado, Spring Boot también lo detectará.

En otras palabras, las dos configuraciones del siguiente ejemplo utilizan el proveedor de Google:

Propiedades

pring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google
spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
Yaml

spring:
  security:
    oauth2:
      client:
        registration:
          my-client:
            client-id: "abcd"
            client-secret: "password"
            provider: "google"
          google:
            client-id: "abcd"
            client-secret: "password"

Servidor de recursos

Si tiene spring-security-oauth2-resource-server en su classpath, Spring Boot puede instalar el servidor de recursos OAuth2. Para la configuración JWT, debe especificar un URI de conjunto JWK o un URI de emisor OIDC, como se muestra en los siguientes ejemplos:

Propiedades
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
Yaml
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: "https://example.com/oauth2/default/v1/keys"
Propiedades
spring.security .oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
Yaml
 
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"
Si el servidor de autorización no admite el URI del conjunto JWK, puede configurar el servidor de recursos con una clave pública utilizada para verificar la firma JWT. Esto se puede hacer usando la propiedad spring.security.oauth2.resourceserver.jwt.public-key-location, donde el valor debe apuntar a un archivo que contiene la clave pública codificada en formato PEM x509.

Las mismas propiedades se aplican tanto a las aplicaciones de servlet como a las reactivas.

También puede definir su propio bean JwtDecoder para aplicaciones de servlet o ReactiveJwtDecoder para aplicaciones reactivas.

En los casos en los que se utilizan tokens opacos en lugar de JWT, puede configurar las siguientes propiedades para validar tokens mediante introspección:

Propiedades

spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
Yaml
 
spring:
  security:
    oauth2:
      resourceserver:
        opaquetoken:
          introspection-uri: "https://example.com/check-token"
          client-id: "my-client-id"
          client-secret: "my-client-secret"

Nuevamente, las mismas propiedades se aplican tanto a las aplicaciones de servlet como a las reactivas.

Alternativamente, puede definir su propio bean OpaqueTokenIntrospector para aplicaciones de servlet o ReactiveOpaqueTokenIntrospector para aplicaciones reactivas.

Servidor de autorización

Actualmente, Spring Security no brinda soporte para implementar un servidor de autorización OAuth 2.0. Sin embargo, esta funcionalidad está disponible en el proyecto Spring Security OAuth, que eventualmente será reemplazado por Spring Security. Hasta entonces, puede usar el módulo spring-security-oauth2-autoconfigure para configurar fácilmente un OAuth 2.0. servidor de autorización; consulte la documentación para obtener instrucciones.