Spring Boot 參考指南(安全)

28. 安全

若是在類路徑上有Spring Security,那麼web應用程序默認是安全的,Spring Boot依賴Spring Security的內容協商策略來決定是使用httpBasic仍是formLogin,要向web應用程序添加方法級安全性,還可使用所需的設置添加@EnableGlobalMethodSecurity,其餘信息能夠在Spring Security參考指南中找到。html

默認的UserDetailsService只有一個用戶,用戶名是user,密碼是隨機的,在應用程序啓動時在INFO級別打印,以下例所示:git

Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
若是你對日誌配置進行了微調,請確保 org.springframework.boot.autoconfigure.security類別設置爲記錄 INFO級別的消息,不然,不會打印默認密碼。

你能夠經過提供spring.security.user.namespring.security.user.password來更改用戶名和密碼。github

你在web應用程序中默認得到的基本特性是:web

  • 使用內存存儲的UserDetailsService(或WebFlux應用程序下的ReactiveUserDetailsService) bean和使用生成密碼的單個用戶(參見SecurityProperties.User)的屬性。
  • 整個應用程序基於表單的登陸或HTTP Basic Security(取決於內容類型)(若是執行器在類路徑上,則包括執行器端點)。
  • 用於發佈身份驗證事件的DefaultAuthenticationEventPublisher

你能夠經過添加bean來提供不一樣的AuthenticationEventPublisherspring

28.1 MVC Security

默認的security配置在SecurityAutoConfigurationUserDetailsServiceAutoConfiguration中實現,SecurityAutoConfiguration導入SpringBootWebSecurityConfiguration用於web安全,UserDetailsServiceAutoConfiguration配置身份驗證,這在非web應用程序中也是相關的,要徹底關閉默認的web應用程序安全配置,能夠添加WebSecurityConfigurerAdapter類型的bean(這樣作不會禁用UserDetailsService配置或執行器的安全)。segmentfault

要關閉UserDetailsService配置,能夠添加UserDetailsServiceAuthenticationProviderAuthenticationManager類型的bean,在Spring Boot示例中有幾個安全的應用程序可讓你從常見的用例開始。api

能夠經過添加自定義的WebSecurityConfigurerAdapter來覆蓋訪問規則,Spring Boot提供了方便的方法,可用於覆蓋執行器端點和靜態資源的訪問規則,可使用EndpointRequest建立一個基於management.endpoints.web.base-path屬性的RequestMatcherPathRequest可用於爲經常使用位置的資源建立RequestMatcher瀏覽器

28.2 WebFlux Security

與Spring MVC應用程序相似,你能夠經過添加Spring-boot-starter-security依賴項來保護WebFlux應用程序,默認的security配置在ReactiveSecurityAutoConfigurationUserDetailsServiceAutoConfiguration中實現。ReactiveSecurityAutoConfiguration導入WebFluxSecurityConfiguration用於web安全,UserDetailsServiceAutoConfiguration配置身份驗證,這在非web應用程序中也是相關的。要徹底關閉默認的web應用程序安全配置,能夠添加WebFilterChainProxy類型的bean(這樣作不會禁用UserDetailsService配置或執行器的安全)。安全

爲了關閉UserDetailsService配置,你能夠添加一個類型爲ReactiveUserDetailsServiceReactiveAuthenticationManager的bean。服務器

能夠經過添加自定義SecurityWebFilterChain來配置訪問規則,Spring Boot提供了方便的方法,可用於覆蓋執行器端點和靜態資源的訪問規則,可使用EndpointRequest建立一個基於management.endpoints.web.base-path屬性的ServerWebExchangeMatcher

PathRequest可用於爲經常使用位置的資源建立ServerWebExchangeMatcher

例如,你能夠經過添加如下內容來定製你的security配置:

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    return http
        .authorizeExchange()
            .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
            .pathMatchers("/foo", "/bar")
                .authenticated().and()
            .formLogin().and()
        .build();
}

28.3 OAuth2

OAuth2是Spring支持的普遍使用的受權框架。

28.3.1 客戶端

若是你的類路徑中有spring-security-oauth2-client,那麼能夠利用一些自動配置來輕鬆地設置OAuth2客戶端,這個配置使用OAuth2ClientProperties下的屬性。

你能夠在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=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.jwk-set-uri=http://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name

默認狀況下,Spring Security的OAuth2LoginAuthenticationFilter只處理匹配/login/oauth2/code/*的url,若是你想定製redirect-uri-template來使用不一樣的模式,你須要提供配置來處理定製模式,例如,你能夠添加相似於如下內容的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和OpenID提供者,包括谷歌、Github、Facebook和Okta,咱們提供了一組提供者默認值(google、github、facebookOkta)。

若是你不須要定製這些提供者,你能夠將提供者屬性設置爲你須要推斷默認值的提供者屬性,另外,若是客戶端的ID與默認支持的提供程序匹配,Spring Boot也會推斷出這一點。

換句話說,下面示例中的兩個配置使用谷歌提供程序:

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

28.3.2 服務器

目前,Spring Security不支持實現OAuth 2.0受權服務器或資源服務器,可是,這個功能能夠從Spring Security OAuth項目中得到,該項目最終將被Spring Security徹底取代,在此以前,你可使用spring-security-oauth2-autoconfigure模塊輕鬆設置OAuth 2.0服務器,有關說明,請參閱其文檔

28.4 Actuator安全

出於安全考慮,除/health/info以外的全部Actuator默認禁用,management.endpoints.web.exposure.include屬性可用於啓用actuator。

若是在類路徑上有Spring Security,而且沒有其餘WebSecurityConfigurerAdapter存在,actuator是經過Spring Boot自動配置來保護的,若是你定義了一個自定義的WebSecurityConfigurerAdapter,Spring Boot自動配置將退出,你將徹底控制actuator訪問規則。

在設置 management.endpoints.web.exposure.include以前,確保暴露的actuator不包含敏感信息和/或經過將它們置於防火牆後或經過相似Spring Security的方式進行安全保護。

28.4.1 跨站請求僞造保護

因爲Spring Boot依賴於Spring Security的默認值,因此CSRF保護默認打開,這意味着,當使用默認安全配置時,須要POST(關閉和日誌記錄器端點)、PUTDELETE的actuator端點將收到403禁止錯誤。

咱們建議,只有在建立非瀏覽器客戶端使用的服務時,才徹底禁用CSRF保護。

有關CSRF保護的其餘信息能夠在Spring Security參考指南中找到。


上一篇:開發Web應用程序

相關文章
相關標籤/搜索