《Spring Boot官方指南》28.3 -28.4
28.3 User Info RestTemplate的自定義
如果您有一個’user-info-uri’,資源伺服器在內部使用’OAuth2RestTemplate’功能來獲取使用者的身份驗證資訊。這將提供一個帶有’userInfoRestTemplate’主鍵的’@Bean’,你使用它的時候不需要知道這些。大多數提供程式使用預設就夠了,但偶爾你可能需要新增額外的攔截器,或者更改請求驗證器(來獲取附加在傳出請求種令牌)。要新增自定義只需建立一個型別為’UserInfoRestTemplateCustomizer’的bean,它有一個方法,將在bean建立後初始化之前呼叫。此處定製的rest template僅
Tip |
---|
要在YAML中設定RSA鍵值,使用’pipe’連續標記將其分隔為多行(’|’),並記住縮排鍵值(它是一個標準的YAML語言特性)。 例如:
security: oauth2: resource: jwt: keyValue: | -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC... -----END PUBLIC KEY----- |
28.3.1 Client
要將您的web應用變成OAuth2客戶端,您只需新增“@ EnableOAuth2Client”註解,Spring Boot將自動建立“OAuth2RestOperations”所需的“OAuth2ClientContext”和“OAuth2ProtectedResourceDetails”。 Spring Boot不會自動建立這樣的bean,但你可以輕鬆地建立自有的:
@Bean public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) { returnnew OAuth2RestTemplate(details, oauth2ClientContext); }
Note |
---|
您可能需要新增限定符並檢查您的配置,因為你的應用程式中可能定義了多個“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中的陣列)。預設情況下範圍為空,由授權伺服器來決定其預設值,通常取決於該伺服器所保留的在客戶端註冊中的設定。
Note |
---|
同樣“security.oauth2.client.client-authentication-scheme”有一個設定預設值為’header’(但你可能需要將其設定為’form’,舉個例子,假如Github作為你的OAuth2提供者,它不會喜歡頭部認證)。實際上,’security.oauth2.clien.*’屬性繫結在’AuthorizationCodeResourceDetails’的例項上,因此可以指定它的所有屬性。 |
Tip |
---|
在非Web應用程式中,也可以建立一個“OAuth2RestOperations”,它依舊關聯著’security.oauth2.client.*’配置。如果你使用它, 你會要求它是一個’客戶端證書令牌授予’(並且不需要使用’@ EnableOAuth2Client’或’@ EnableOAuth2Sso’註解)。要防止基礎結構被定義,只需從配置中刪除“security.oauth2.client.client-id”(或將其設定為空字串)。 |
28.3.2 單點登入
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
由於預設情況下所有路徑都是安全的,因此沒有’home’頁面可以提供給未認證的使用者來邀請他們登入(通過訪問’/ login’路徑或’security.oauth2.sso.login指定的路徑)。
要自定義要保護的訪問規則或路徑,您可以新增一個“home”頁面,以及新增“@ EnableOAuth2Sso”註解到“WebSecurityConfigurerAdapter”,這將使它通過一些必要的部件來得到增強以使 ‘/ login’ 路徑生效。例如,未經身份驗證只允許通過“/”訪問主頁,其他保持預設設定:
@Configuration public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void init(WebSecurity web) { web.ignore("/"); } @Override protected void configure(HttpSecurity http) throws Exception { http.antMatcher("/**").authorizeRequests().anyRequest().authenticated(); } }
28.4 執行器安全
如果使用了執行器,你會發現
- 即使應用程式端點不安全,管理端點也是安全的。
- Security事件將轉變成“AuditEvents”併發布到“AuditService”。
- 預設使用者將具有“ADMIN”角色以及“USER”角色。
可以使用外部屬性(’management.security。*’)來修改執行器安全功能。要覆蓋應用程式訪問規則,請新增型別為“WebSecurityConfigurerAdapter”的’@Bean’,如果您不想覆蓋執行程式訪問規則,請使用’@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)’註解,或者如果你想要覆蓋執行器訪問規則請使用’@Order(ManagementServerProperties. ACCESS_OVERRIDE_ORDER)’註解。