閱讀657 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《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) {
    return new 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)’注解。

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 12:04:48

  上一篇:go  Spring Boot 整合 Elasticsearch,實現 function score query 權重分查詢
  下一篇:go  《雲數據管理》2.1邏輯時間和Lamport時鍾