Security(安全)

如果Spring Security位于类路径上,则默认情况下Web应用程序是安全的。Spring Boot依赖于Spring Security的内容协商策略来确定是否使用httpBasicformLogin。要向Web应用程序添加方法级安全性,您还可以@EnableGlobalMethodSecurity使用所需的设置进行添加。其他信息可以在 Spring Security Reference Guide中找到

默认设置UserDetailsService只有一个用户。用户名是user,密码是随机的,在应用程序启动时以INFO级别打印,如以下示例所示:

1
使用生成的安全密码:78fa095d-3f4c-48b1-ad50-e24c31d5cf35

如果您对日志记录配置进行微调,请确保将 org.springframework.boot.autoconfigure.security类别设置为log INFO-level messages。否则,不会打印默认密码。

您可以通过提供spring.security.user.name和 更改用户名和密码spring.security.user.password

您在Web应用程序中默认获得的基本功能包括:

  • A UserDetailsService(或ReactiveUserDetailsServiceWebFlux应用程序的情况)bean具有内存存储,单个用户具有生成的密码(请参阅SecurityProperties.User 用户的属性)。
  • 基于表单的登录或HTTP基本安全性(取决于Content-Type)用于整个应用程序(如果执行器在类路径上,则包括执行器端点)。
  • 一个DefaultAuthenticationEventPublisher用于发布身份验证事件。

你可以AuthenticationEventPublisher通过为它添加一个bean 来提供不同的东西。

MVC安全性

默认安全配置在SecurityAutoConfiguration和中 实现UserDetailsServiceAutoConfigurationSecurityAutoConfiguration导入SpringBootWebSecurityConfigurationWeb安全性并 UserDetailsServiceAutoConfiguration配置身份验证,这也与非Web应用程序相关。要完全关闭默认Web应用程序安全配置,您可以添加类型的bean WebSecurityConfigurerAdapter(这样做不会禁用UserDetailsService配置或Actuator的安全性)。

为了还关闭UserDetailsService的配置,您可以添加类型的豆 UserDetailsServiceAuthenticationProviderAuthenticationManagerSpring Boot示例中有几个安全的应用程序可以帮助您开始使用常见的用例。

可以通过添加自定义来覆盖访问规则WebSecurityConfigurerAdapter。Spring Boot提供了便捷方法,可用于覆盖执行器端点和静态资源的访问规则。EndpointRequest可用于创建RequestMatcher 基于management.endpoints.web.base-path属性的。 PathRequest可用于RequestMatcher在常用位置创建资源。

WebFlux安全性

与Spring MVC应用程序类似,您可以通过添加spring-boot-starter-security依赖项来保护WebFlux应用程序。默认安全配置在ReactiveSecurityAutoConfiguration和中 实现UserDetailsServiceAutoConfigurationReactiveSecurityAutoConfiguration导入WebFluxSecurityConfigurationWeb安全性并UserDetailsServiceAutoConfiguration 配置身份验证,这也与非Web应用程序相关。要完全关闭默认Web应用程序安全配置,您可以添加类型的bean WebFilterChainProxy(这样做不会禁用UserDetailsService配置或Actuator的安全性)。

要关闭UserDetailsService配置,可以添加类型为ReactiveUserDetailsService或的bean ReactiveAuthenticationManager

可以通过添加自定义来配置访问规则SecurityWebFilterChain。Spring Boot提供了便捷方法,可用于覆盖执行器端点和静态资源的访问规则。EndpointRequest可用于创建 ServerWebExchangeMatcher基于management.endpoints.web.base-path 属性的。

PathRequest可用于ServerWebExchangeMatcher在常用位置创建资源。

例如,您可以通过添加以下内容来自定义安全配置:

1
2
3
4
5
6
7
8
9
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http.authorizeExchange()
.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.pathMatchers("/foo", "/bar")
.authenticated().and()
.formLogin().and()
.build();
}

OAuth2

OAuth2是Spring支持的一种广泛使用的授权框架。

客户端

如果您具有spring-security-oauth2-client类路径,则可以利用某些自动配置来轻松设置OAuth2 / Open ID Connect客户端。此配置使用下的属性OAuth2ClientProperties。相同的属性适用于servlet和反应式应用程序。

您可以在spring.security.oauth2.client前缀下注册多个OAuth2客户端和提供程序 ,如以下示例所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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-template=http://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-template=http://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=http://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=http://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=http://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=http://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name

对于支持OpenID Connect发现的 OpenID Connect提供程序,可以进一步简化配置。需要为提供程序配置一个issuer-uriURI,它将其声明为其颁发者标识符。例如,如果 issuer-uri提供的是“https://example.com”,`OpenID Provider Configuration Request则会进行“https://example.com/.well-known/openid-configuration”。结果预计是一个OpenID Provider Configuration Response。以下示例显示如何使用以下命令配置OpenID Connect Providerissuer-uri`:

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

默认情况下,Spring Security OAuth2LoginAuthenticationFilter仅处理URL匹配/login/oauth2/code/*。如果要自定义redirect-uri以使用其他模式,则需要提供配置以处理该自定义模式。例如,对于servlet应用程序,您可以添加WebSecurityConfigurerAdapter类似于以下内容的应用程序:

1
2
3
4
5
6
7
8
9
10
11
12
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.redirectionEndpoint()
.baseUri("/custom-callback");
}
}

OAuth2客户端注册常见providers

对于常见的OAuth2和OpenID提供商,包括谷歌,Github上,Facebook和1563,我们提供了一组供应商默认的(googlegithubfacebook,和okta,分别)。

如果您不需要自定义这些提供程序,则可以将provider属性设置为需要推断默认值的属性。此外,如果客户端注册的密钥与默认支持的提供程序匹配,则Spring Boot也会推断出。

换句话说,以下示例中的两个配置使用Google提供程序:

1
2
3
4
5
6
spring.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

Resource Server(资源服务器)

如果您具有spring-security-oauth2-resource-server类路径,则只要指定了JWK Set URI或OIDC Issuer URI,Spring Boot就可以设置OAuth2资源服务器,如以下示例所示:

1
spring.security.oauth2.resourceserver.jwt.jwk-set-uri = https://example.com/oauth2/default/v1/keys
1
spring.security.oauth2.resourceserver.jwt.issuer-uri = https://dev-123456.oktapreview.com/oauth2/default/

相同的属性适用于servlet和反应应用程序。

或者,您可以JwtDecoder为servlet应用程序或ReactiveJwtDecoder响应应用程序定义自己的bean 。

Authorization Server(授权服务器)

目前,Spring Security不支持实施OAuth 2.0授权服务器。但是,此功能可从Spring Security OAuth项目获得,该项目最终将完全被Spring Security取代。在此之前,您可以使用该spring-security-oauth2-autoconfigure模块轻松设置OAuth 2.0授权服务器; 请参阅其文档以获取说明

Actuator Security(执行器安全性)

出于安全考虑,默认情况下除了/health/info禁用所有执行器。该management.endpoints.web.exposure.include属性可用于启用执行器。

如果春季安全是在类路径上,并没有其他WebSecurityConfigurerAdapter存在,比其他所有的驱动器/health,并/info通过春天开机自动配置安全。如果您定义自定义WebSecurityConfigurerAdapter,Spring Boot自动配置将退回,您将完全控制执行器访问规则。

在设置之前management.endpoints.web.exposure.include,请确保暴露的执行器不包含敏感信息和/或通过将它们放在防火墙后面或通过Spring Security等方式进行保护。

跨站点请求伪造保护

由于Spring Boot依赖于Spring Security的默认值,因此默认情况下会启用CSRF保护。这意味着执行器端点需要POST(关闭和记录器端点),PUT或者DELETE在使用默认安全配置时将获得403禁止错误。

我们建议仅在创建非浏览器客户端使用的服务时才完全禁用CSRF保护。

有关CSRF保护的其他信息,请参阅“ Spring Security参考指南”