4.9。安全
如果Spring Security
在類路徑上,則默認情況下Web應用程序是采用的。Spring Boot依靠Spring Security的內容協商策略來確定使用httpBasic
還是formLogin
。要將方法級安全性添加到Web應用程序,您還可以添加@EnableGlobalMethodSecurity
所需的設置。
默認的UserDetailsService
有一個用戶。用戶名為user
,密碼為隨機密碼,並在應用程序啟動時以INFO
級別顯示,如下例所示:
Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
如果您微調日志記錄配置,請確保將org.springframework.boot.autoconfigure.security
類別設置為日志INFO
級別的消息。否則,不會打印默認密碼。
您可以通過提供一個spring.security.user.name和spring.security.user.password
來更改用戶名和密碼。
默認情況下,您在Web應用程序中獲得的基本功能是:
- 一個具有內存存儲的
UserDetailsService
bean (或WebFlux應用程序中的ReactiveUserDetailsService
)和一個具有生成的密碼的單個用戶(請參考SecurityProperties.User
的屬性)。 - 整個應用程序的基於表單的登錄或
HTTP Basic
安全性(取決於請求中的Accept標頭)(如果執行器位於類路徑上,則包括執行器端點)。 DefaultAuthenticationEventPublisher
,用於發布身份驗證事件。
您可以通過添加一個bean 來提供不同的AuthenticationEventPublisher
。
4.9.1。MVC安全
默認的安全配置在SecurityAutoConfiguration
和UserDetailsServiceAutoConfiguration
中實現。 SecurityAutoConfiguration
導入SpringBootWebSecurityConfiguration
保證Web安全性,UserDetailsServiceAutoConfiguration
配置身份驗證,這在非Web應用程序中也很重要。要完全關閉默認的Web應用程序安全性配置或合並多個Spring Security組件(例如OAuth 2 Client
和Resource Server
),請添加一個WebSecurityConfigurerAdapter
類型的bean (這樣做不會禁用UserDetailsService
配置或Actuator
的安全性)。
為了關閉UserDetailsService
的配置,您可以添加UserDetailsService
,AuthenticationProvider
或AuthenticationManager
類型的bean。
可以通過添加自定義WebSecurityConfigurerAdapter
來覆蓋訪問規則。Spring Boot提供了方便的方法,可用於覆蓋執行器端點和靜態資源的訪問規則。 EndpointRequest
可用於創建基於management.endpoints.web.base-path
屬性的RequestMatcher
。 PathRequest
可用於創建在常用RequestMatcher
資源。
4.9.2。WebFlux安全
與Spring MVC應用程序類似,您可以通過添加spring-boot-starter-security
依賴項來保護WebFlux應用程序。默認的安全配置在ReactiveSecurityAutoConfiguration
和UserDetailsServiceAutoConfiguration
中實現。 ReactiveSecurityAutoConfiguration
導入WebFluxSecurityConfiguration
保證Web安全性,UserDetailsServiceAutoConfiguration
配置身份驗證,這在非Web應用程序中也很重要。要完全關閉默認的Web應用程序安全性配置,可以添加一個WebFilterChainProxy
類型的bean (這樣做不會禁用UserDetailsService
配置或執行器的安全性)。
要關閉UserDetailsService
配置,可以添加類型為ReactiveUserDetailsService
或ReactiveAuthenticationManager
的Bean 。
可以通過添加自定義SecurityWebFilterChain
bean 來配置訪問規則以及使用多個Spring Security組件(例如OAuth 2 Client和Resource Server)。Spring Boot提供了方便的方法,可用於覆蓋執行器端點和靜態資源的訪問規則。 EndpointRequest
可用於創建基於management.endpoints.web.base-path
屬性的ServerWebExchangeMatcher
。
PathRequest
可用於為常用位置的資源創建ServerWebExchangeMatcher
。
例如,您可以通過添加以下內容來自定義安全配置:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.pathMatchers("/foo", "/bar")
.authenticated().and()
.formLogin().and()
.build();
}
4.9.3。OAuth2
OAuth2是Spring支持的一種廣泛使用的授權框架。
Client
如果spring-security-oauth2-client
在類路徑中,則可以利用一些自動配置功能來輕松設置OAuth2 / Open ID Connect客戶端。此配置使用的屬性OAuth2ClientProperties
。相同的屬性適用於servlet和反應式應用程序。
您可以在spring.security.oauth2.client
前綴下注冊多個OAuth2客戶端和提供者,如以下示例所示:
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=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-template=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
對於支持OpenID Connect discovery的 OpenID Connect提供程序,可以進一步簡化配置。提供者需要配置issuer-uri
,即它聲明為其發布者標識符的URI。例如,如果issuer-uri提供的是“ https://example.com”,則將OpenID Provider Configuration Request對“ https://example.com/.well-known/openid-configuration”進行標記。結果預期為OpenID Provider Configuration Response。以下示例顯示如何使用issuer-uri來配置OpenID Connect提供程序:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
默認情況下,Spring Security OAuth2LoginAuthenticationFilter
只處理匹配 /login/oauth2/code/*
的URL。如果要自定義redirect-uri
,以使用其他模式,則需要提供配置以處理該自定義模式。例如,對於Servlet應用程序,您可以添加WebSecurityConfigurerAdapter
類似於以下內容的自己的應用程序:
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.redirectionEndpoint()
.baseUri("/custom-callback");
}
}
普通提供商的OAuth2客戶端注冊
對於常見的OAuth2和OpenID提供商,包括谷歌,Github,Facebook和Okta,我們提供了一組默認的供應商(google,github,facebook,和okta)。
如果不需要自定義這些供應商,則可以將provider屬性設置為需要為其推斷默認值的屬性。另外,如果用於客戶端注冊的key與默認支持的供應商匹配,則Spring Boot也會進行推斷。
換句話說,以下示例中的兩個配置都使用Google供應商:
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
在類路徑中,則Spring Boot可以設置OAuth2資源服務器。對於JWT配置,需要指定JWK Set URI或OIDC Issuer URI,如以下示例所示:
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/
如果授權服務器不支持JWK Set URI,則可以使用用於驗證JWT簽名的公共密鑰來配置資源服務器。可以使用spring.security.oauth2.resourceserver.jwt.public-key-location
屬性來完成此操作,該屬性值需要指向包含PEM編碼的x509格式的公鑰的文件。
相同的屬性適用於servlet和反應式應用程序。
另外,您可以為Servlet應用程序或ReactiveJwtDecoder
響應式應用程序定義自己的JwtDecoder
bean 。
如果使用不透明令牌而不是JWT,則可以配置以下屬性以通過自我檢查來驗證令牌:
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
同樣,相同的屬性適用於servlet和反應式應用程序。
另外,您可以為Servlet應用程序定義OpaqueTokenIntrospector
bean或為響應式應用程序定義ReactiveOpaqueTokenIntrospector
bean 。
Authorization Server
當前,Spring Security不提供對實現OAuth 2.0授權服務器的支持。但是,Spring Security OAuth項目提供了此功能,最終將被Spring Security完全取代。在此之前,您可以使用spring-security-oauth2-autoconfigure
模塊輕松設置OAuth 2.0授權服務器。
4.9.4。SAML 2.0
Relying Party
如果spring-security-saml2-service-provider
在類路徑上,則可以利用一些自動配置功能來輕松設置SAML 2.0。此配置使用Saml2RelyingPartyProperties
的屬性。
依賴方注冊代表身份提供商IDP和服務提供商SP之間的配對配置。您可以在spring.security.saml2.relyingparty
前綴下注冊多個依賴方,如以下示例所示:
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.verification.credentials[0].certificate-location=path-to-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.entity-id=remote-idp-entity-id1
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.sso-url=https://remoteidp1.sso.url
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.verification.credentials[0].certificate-location=path-to-other-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.entity-id=remote-idp-entity-id2
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.sso-url=https://remoteidp2.sso.url
4.9.5。Actuator Security
為了安全起見,默認情況下,除/health
和/info
以外的所有執行器都是禁用的。management.endpoints.web.exposure.include
屬性可用於啟用執行器。
如果Spring Security是在類路徑上,並且沒有其他WebSecurityConfigurerAdapter
存在,所有的執行器除了/health和/info以外,通過Spring Boot自動配置保護。如果您自定義一個WebSecurityConfigurerAdapter
,Spring Boot自動配置將退出,您將完全控制執行器訪問規則。
在設置management.endpoints.web.exposure.include
之前,請確保公開的執行器不包含敏感信息,並且通過將它們放置在防火牆后面或通過諸如Spring Security之類的東西進行保護。
跨站點請求偽造(CSRF)保護
由於Spring Boot依賴於Spring Security的默認值,因此默認情況下CSRF保護是打開的。這意味着在使用默認安全性配置時,執行器端點請求POST(關閉和記錄器端點)PUT或DELETE將收到403
禁止錯誤。
我們建議僅在創建非瀏覽器客戶端使用的服務時完全禁用CSRF保護。