安全 - Security
如果Spring Security位於類路徑中,則默認情況下,Web應用程序將在所有HTTP端點上使用“基本”身份驗證來確保安全。要將方法級安全性添加到Web應用程序中,您還可以使用所需的設置添加@EnableGlobalMethodSecurity
。可以在Spring
Security Reference中找到更多信息。
默認的AuthenticationManager
只有一個用戶(“用戶”用戶名和隨機密碼,在應用程序啓動時以INFO級別打印)
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
如果您微調日誌記錄配置,請確保將org.springframework.boot.autoconfigure.security
類別設置爲記錄INFO消息,否則將不會輸出默認密碼。
您可以通過提供security.user.password
來更改密碼。此屬性和其他有用的屬性通過SecurityProperties
(屬性前綴“ security”)外部化。
默認的安全配置在SecurityAutoConfiguration
以及從那裏導入的類中實現(用於Web安全的SpringBootWebSecurityConfiguration
和用於身份驗證配置的AuthenticationManagerConfiguration
,這也與非Web應用程序相關.
要完全關閉默認的Web應用程序安全配置,您可以添加具有@EnableWebSecurity
的bean(這不會禁用身份驗證管理器配置或Actuator
的安全性)。 要對其進行自定義,通常使用外部屬性和WebSecurityConfigurerAdapter
類型的Bean(例如,添加基於表單的登錄名)
如果添加@EnableWebSecurity並還禁用Actuator安全性,除非添加自定義WebSecurityConfigurerAdapter,否則將獲得整個應用程序的默認基於表單的登錄名
要同時關閉身份驗證管理器配置,你可以添加AuthenticationManager
類的的bean,活荷載通過AuthenticationManagerBuilder
自動裝配到@Configuration
類中的方法來配置全局AuthenticationManager
Spring Boot示例中有幾個Spring Boot samples,可以幫助您開始使用常見的用例。
在Wendy應用程序中開箱即用的基本功能:
-
具有內存存儲和單個用戶的
AuthenticationManager
bean(有關用戶的屬性,請看SecurityProperties.User
) -
忽略常見靜態資源
/css/** , /js/**, /images/** , /webjars/** , **/favicon.ico
路徑(不安全) -
其他端點的HTTP 基本安全性
-
發佈到Spring的
ApplicationEventPublisher
的安全事件(身份驗證的成功和失敗,訪問被拒) -
默認情況下,Spring Security 提供常見低級功能(HSTS,XSS,CSRF,緩存)處於啓動狀態
可以使用外部屬性(security.*
)打開或者關閉以上內容或者對其進行修改.要覆蓋訪問規則而不像更改任何其他自動配,請添加具有@Order
(SecurityProperties.ACCESS_OVERRIDE_ORDER
)類型的WebSecurityConfigurerAdapter
類型的@Bean
並對其進行配置以滿足你的需求
默認情況下,WebSecurityConfigurerAdapter將匹配任何路徑。如果您不想完全覆蓋Spring Boot的自動配置訪問規則,則適配器必須顯式配置要覆蓋的路徑。
OAuth2
如果您在類路徑中具有spring-security-oauth2
,則可以利用一些自動配置功能來輕鬆設置授權或資源服務器。有關完整的詳細信息,請參閱Spring Security OAuth 2 Developers
Guide
授權服務
要創建授權服務並授予訪問令牌,需要使用EnableAuthorizationServer
並提供security.oauth2.client.cilent-id
和security.oauth2.client.client.secret
屬性.客戶端將在內存中爲您註冊
完成之後,您將能夠使用客戶端憑據來創建訪問令牌
curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd
/ token端點的基本身份驗證憑據是client-id
和client-secret
。用戶憑證是正常的Spring Security用戶詳細信息(在Spring Boot中默認爲“user”和隨機密碼)
要自行關閉自動配置並配置Authorization Server功能,只需添加類型AuthorizationServerConfigurer
的@Bean
資源服務器 - Resource Server
要使用訪問令牌,你需要一個資源服務器(可以和授權服務相同).創建資源服務很簡單,只需要添加@EnableResourceServer
並提供一些配置以允許服務解碼訪問令牌.如果你的應用程序也是授權服務,則它已經知道如何解碼令牌,無需執行其他操作.如果你的應用是獨立服務,則需要爲它提供更多配置.
security.oauth2.resource.user-info-uri
to use the/me
resource (e.g.https://uaa.run.pivotal.io/userinfo
on PWS)security.oauth2.resource.token-info-uri
to use the token decoding endpoint (e.g.https://uaa.run.pivotal.io/check_token
on PWS).
如果同時制定了user-info-url
和token-info-url
,則可以設置一個標誌來表示誰優先(默認是prefer-token-info=true
)
另外,如果令牌是JWT,則可以替代user-info-url
或是token-info-url
,則可以配置security.oauth2.resource.jwt.key-value
對其進行本地解碼(該密鑰爲驗證密鑰)
$ curl https://uaa.run.pivotal.io/token_key
{"alg":"SHA256withRSA","value":"-----BEGIN PUBLIC KEY-----\nMIIBI...\n-----END PUBLIC KEY-----\n"}
如果使用security.oauth2.resource.jwt.key-uri
,則在應用程序啓動時需要運行授權服務器。如果找不到密鑰,它將記錄一條警告,並告訴您如何解決。
OAuth2資源由具有順序的security.oauth2.resource.filter-order
過濾器的鏈保護,並且默認情況下是在過濾器之後默認情況下保護執行器端點(因此,執行器端點將保留在HTTP Basic上,除非您更改順序)
User 中的Token 類型 - Token Type in User Info
Google和某些其他第三方身份提供者對標頭中發送到用戶信息端點的令牌類型名稱更加嚴格。 默認值爲“ Bearer”,它適合大多數提供商並符合規範,但是如果需要更改它,則可以設置security.oauth2.resource.token-type
自定義用戶信息RestTemplate Customizing the User Info RestTemplate
如果您有一個user-info-uri
,則資源服務器功能會在內部使用OAuth2RestTemplate
來獲取用戶詳細信息以進行身份驗證.它作爲UserInfoRestTemplateFactory
類型的@Bean
提供。對於大多數提供程序來說,默認值應該是合適的,但有時您可能需要添加其他攔截器,或更改請求身份驗證器(令牌將其附加到傳出請求的方式)。要添加定製,只需創建一個類型爲的bean.要添加定製,只需創建一個類型爲的bean
UserInfoRestTemplateCustomizer-
它具有單個方法,該方法將在創建bean之後但初始化之前調用.在此自定義的其餘模板僅在內部用於執行身份驗證。另外,您可以定義自己的UserInfoRestTemplateFactory
@Bean
以完全控制.
要在YAML中設置RSA密鑰值,請使用“管道”延續標記將其分成多行(“ |”),並記住縮進密鑰值(這是標準的YAML語言功能)。例:
security:
oauth2:
resource:
jwt:
keyValue: |
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC...
-----END PUBLIC KEY-----
客戶端 - Client
要在web項目上使用OAyth2
,只需要添加@EnableOAuth2Cilent
,Spring Boot會自動創建OAuth2ProtectedResourceDetails
和OAuth2CilentContext
,這對於創建OAuth2RestOperations
是必須的.Spring並不會自動生成這個類
@Bean
public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext,
OAuth2ProtectedResourceDetails details) {
return new OAuth2RestTemplate(details, oauth2ClientContext);
}
您可能想要添加一個限定符並檢查您的配置,因爲您的應用程序中可能定義了多個RestTemplate
此配置使用security.oauth2.client。*
作爲憑據(與授權服務器中可能使用的憑據相同),但此外,它還需要知道授權服務器中的授權和令牌URI。例如:
application.yml
security:
oauth2:
client:
clientId: bd1c0a783ccdd1c9b9e4
clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
當您嘗試使用OAuth2RestTemplate
時,具有此配置的應用程序將重定向到Github進行授權。如果您已經登錄Github,您甚至都不會注意到它已通過身份驗證。僅當您的應用程序在端口8080上運行時,這些特定的憑據纔有效(在Github或其他提供商中註冊您自己的客戶端應用,以提高靈活性)
要限制客戶端獲取訪問令牌時要求的範圍,可以設置security.oauth2.client.scope(逗號分隔或YAML中的數組).
默認情況下,作用域爲空,並且由授權服務器決定默認值,通常取決於它所擁有的客戶端註冊中的設置.
還有一個security.oauth2.client.client-authentication-scheme
設置,默認設置爲“ header”,但您可能需要將其設置爲“ form”,如果您的OAuth2提供程序不喜歡標頭身份驗證,例如Github。實際上,security.oauth2.client。*屬性綁定到AuthorizationCodeResourceDetails的實例,因此可以指定其所有屬性
在非Web應用程序中,您仍然可以創建OAuth2RestOperations,並且仍將其連接到security.oauth2.client。*
配置中
在這種情況下,這是您要使用的“客戶憑證令牌授予”(無需使用@ EnableOAuth2Client
或@ EnableOAuth2Sso
).要阻止定義該基礎架構,只需從您的配置中刪除security.oauth2.client.client-id(或將其設爲空字符串)
單點登錄 - Single Sign On
OAuth2客戶端可用於從提供者獲取用戶詳細信息(如果可用),然後將其轉換爲Spring Security的身份驗證令牌。上面的資源服務器通過user-info-uri屬性支持此操作。這是基於OAuth2的單點登錄(SSO)協議的基礎,Spring Boot通過提供註釋@ EnableOAuth2Sso使其易於參與上面的Github客戶端可以通過添加該註釋並聲明在何處找到該端點(除了上面已經列出的security.oauth2.client。*配置之外),使用Github / user /端點來保護其所有資源並進行身份驗證:
application.yml.
security:
oauth2:
...
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false
由於默認情況下所有路徑都是安全的,因此沒有可以顯示給未經身份驗證的用戶並邀請他們登錄的“主頁”頁面(通過訪問/ login路徑或security.oauth2.sso.login-pat
h指定的路徑)
要自定義要保護的訪問規則或路徑,例如,您可以添加“主頁”頁面,爲了自定義要保護的訪問規則或路徑,因此您可以添加一個“主頁”頁面,例如,可以將@ EnableOAuth2Sso
添加到WebSecurityConfigurerAdapter
中,並且註釋將對其進行修飾和增強,並添加必要的部分以獲取/ login。 例如,在這裏,我們僅允許未經授權的訪問主頁“ /”,並保留其他所有內容的默認設置:
@Configuration
static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void init(WebSecurity web) {
web.ignoring().antMatchers("/");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").authorizeRequests().anyRequest().authenticated();
}
}
執行器安全 - Actuator Security
如果還使用了執行器,則會發現:
- The management endpoints are secure even if the application endpoints are insecure.
- Security events are transformed into
AuditEvent
instances and published to theAuditEventRepository
. - The default user will have the
ACTUATOR
role as well as theUSER
role.
可以使用外部屬性(management.security。*)修改執行器的安全功能。 要覆蓋應用程序訪問規則,請添加類型爲WebSecurityConfigurerAdapter的@Bean,如果您不想覆蓋執行器訪問規則,請使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER);如果要覆蓋執行器訪問規則,請使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER) 執行器訪問規則。
求求你們給個關注吧~~~~~~,完整版文檔公衆號回覆 ‘spring’ 即可獲得