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.
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
(oReactiveUserDetailsService
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, consulteSecurityProperties.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:
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();
}
}
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. :
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
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
:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
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:
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()
}
}
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:
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
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:
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: "https://example.com/oauth2/default/v1/keys"
spring.security .oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"
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:
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
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.
GO TO FULL VERSION