20191118 Spring Boot官方文檔學習(4.9)


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安全

默認的安全配置在SecurityAutoConfigurationUserDetailsServiceAutoConfiguration中實現。 SecurityAutoConfiguration導入SpringBootWebSecurityConfiguration保證Web安全性,UserDetailsServiceAutoConfiguration配置身份驗證,這在非Web應用程序中也很重要。要完全關閉默認的Web應用程序安全性配置或合並多個Spring Security組件(例如OAuth 2 ClientResource Server),請添加一個WebSecurityConfigurerAdapter類型的bean (這樣做不會禁用UserDetailsService配置或Actuator的安全性)。

為了關閉UserDetailsService的配置,您可以添加UserDetailsServiceAuthenticationProviderAuthenticationManager類型的bean。

可以通過添加自定義WebSecurityConfigurerAdapter來覆蓋訪問規則。Spring Boot提供了方便的方法,可用於覆蓋執行器端點和靜態資源的訪問規則。 EndpointRequest可用於創建基於management.endpoints.web.base-path屬性的RequestMatcherPathRequest可用於創建在常用RequestMatcher資源。

4.9.2。WebFlux安全

與Spring MVC應用程序類似,您可以通過添加spring-boot-starter-security依賴項來保護WebFlux應用程序。默認的安全配置在ReactiveSecurityAutoConfigurationUserDetailsServiceAutoConfiguration中實現。 ReactiveSecurityAutoConfiguration導入WebFluxSecurityConfiguration保證Web安全性,UserDetailsServiceAutoConfiguration配置身份驗證,這在非Web應用程序中也很重要。要完全關閉默認的Web應用程序安全性配置,可以添加一個WebFilterChainProxy類型的bean (這樣做不會禁用UserDetailsService配置或執行器的安全性)。

要關閉UserDetailsService配置,可以添加類型為ReactiveUserDetailsServiceReactiveAuthenticationManager的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保護。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM