1. 程式人生 > >Jhipster技術棧

Jhipster技術棧

1 OAuth2認證模式

1.1 密碼模式

密碼模式(Resource Owner Password Credentials)中,使用者向客戶端提供自己的使用者名稱和密碼。客戶端使用這些資訊,向"認證伺服器"進行認證。在這種模式中,使用者必須把自己的密碼給客戶端,但是客戶端不得儲存密碼。 流程如下: a, 使用者向客戶端提供使用者名稱和密碼。 b, 客戶端將使用者名稱和密碼發給認證伺服器,向後者請求令牌。 c, 認證伺服器確認無誤後,向客戶端提供訪問令牌。 d, 客戶端之後所有訪問都會傳遞令牌。

1.2 客戶端模式

客戶端模式(Client Credentials)指客戶端以服務自身的名義,而不是以使用者的名義,向"認證伺服器"進行認證。 流程如下: a, 客戶端從配置檔案或者資料庫獲取認證資訊。 b, 客戶端將認證資訊發給認證伺服器,並請求返回一個訪問令牌。 c, 認證伺服器確認認證資訊無誤後,向客戶端提供訪問令牌。 d, 客戶端之後的所有訪問不會傳遞這個令牌。

2 UAA認證方式

2.1 使用者呼叫

oauth2認證模式: 密碼模式

配置檔案相關內容

oauth2:     
  web-client-configuration:        
    #change client secret in production, keep in sync with UAA configuration        
    client-id: web_app        
    secret: changeit

時序圖

說明:這種認證方式是用在使用者訪問的場景,也就是服務間呼叫時總是帶著使用者名稱和密碼資訊。

2.2 機器呼叫

oauth2認證模式: 密碼模式

配置檔案相關內容

jhipster:    
  security:        
    client-authorization:            
      client-id: internal            
      client-secret: internal

時序圖

說明:這種認證方式是用在內部服務之間呼叫的場景,也就是服務間呼叫時是沒有使用者名稱和密碼資訊的。

3 原始碼分析

3.1 UAA

com.yourcompany.uaa.config.UaaConfiguration

註冊為認證伺服器,註冊使用者呼叫客戶端(web_app)和機器呼叫客戶端(internal)。目前都是寫死的,如果需要儲存所有客戶端到資料庫,需要修改方法configure(ClientDetailsServiceConfigurer clients)。

com.yourcompany.uaa.config.UaaProperties

uaa相關配置屬性和值。

com.yourcompany.uaa.config.UaaWebSecurityConfiguration

配置不需要認證的url。

com.yourcompany.uaa.security.DomainUserDetailsService

查詢資料庫返回包含完整使用者資訊的物件。

com.yourcompany.uaa.security.IatTokenEnhancer

新增iat到token中,即token建立時間。

com.yourcompany.uaa.security.SecurityUtils

spring security 工具類,獲取當前執行緒使用者的登入名,判斷當前登入使用者是否認證過,判斷當前使用者是否具有指定的許可權。

com.yourcompany.uaa.security.SpringSecurityAuditorAware

獲取當前執行緒使用者的登入名,呼叫SecurityUtils的方法。

com.yourcompany.uaa.security.TokenProvider

建立token工具類。

org.springframework.security.core.userdetails.User

內建使用者類,儲存使用者名稱,密碼,賬號是否過期,賬號是否鎖定,賬號憑證是否過期,是否可用。

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter

內建過濾器,呼叫AuthenticationManager校驗form表單提交的使用者名稱密碼。

org.springframework.security.oauth2.provider.endpoint.TokenEndpoint

內建端點,接受客戶端請求,認證後返回token。

org.springframework.security.oauth2.provider.endpoint.TokenKeyEndpoint

內建端點,接受客戶端請求,返回驗證公鑰。

3.2 Gateway

com.yourcompany.gateway.web.filter.RefreshTokenFilter

過濾器,過濾傳入的請求並重新整理到期之前的訪問令牌。

com.yourcompany.gateway.web.filter.RefreshTokenFilterConfigurer

配置類,配置refreshtokenfilter到工程裡。

com.yourcompany.gateway.config.MicroserviceSecurityConfiguration

註冊為資源伺服器,保護/api/和/management/等資源。

com.yourcompany.gateway.config.oauth2.OAuth2AuthenticationConfiguration

註冊為oauth2的資源伺服器,保護/auth/logout, 註冊RefreshTokenFilterConfigurer到應用過濾鏈中。

com.yourcompany.gateway.config.oauth2.OAuth2JwtAccessTokenConverter

access token解碼器,將token解碼為身份物件;獲取uaa公鑰並配置為金鑰簽名儲存在記憶體中。

com.yourcompany.gateway.config.oauth2.OAuth2Properties

儲存配置檔案中oauth2部分的屬性。

com.yourcompany.gateway.security.AuthoritiesConstants

對應uaa資料表jhi_authority。

com.yourcompany.gateway.security.SecurityUtils

spring security 工具類,獲取當前登入使用者的登入名,判斷當前登入使用者是否認證過,判斷當前使用者是否具有指定的許可權。

com.yourcompany.gateway.security.oauth2.CookieTokenExtractor

從cookie中解析出access token,使用了OAuth2CookeiHelper。

com.yourcompany.gateway.security.oauth2.OAuth2CookieHelper

cookie幫助類。 getClaim()方法可以從token中獲取明文資訊。

com.yourcompany.gateway.security.oauth2.OAuth2AuthenticationService

管理OAuth2的身份驗證情況,儲存(更新)access token和refresh token的Cookie。

com.yourcompany.gateway.security.oauth2.OAuth2Cookies

儲存access token和refresh token。

com.yourcompany.gateway.security.oauth2.CookiesHttpServletRequestWrapper

請求對映器,用於修改原始請求中的cookie。

com.yourcompany.gateway.security.oauth2.CookieCollection

允許修改的Cookie集合,與單純的陣列不同。

com.yourcompany.gateway.security.oauth2.OAuth2SignatureVerifierClient

介面, 定義方法getSignatureVerifier(), 表示建立一個SignatureVerifier,用於獲取公鑰並驗證JWT令牌。

com.yourcompany.gateway.security.oauth2.UaaSignatureVerifierClient

客戶端從UAA獲取公鑰並返回SignatureVerifier。實現了OAuth2SignatureVerifierClient介面的getSignatureVerifier()方法。

com.yourcompany.gateway.security.oauth2.OAuth2TokenEndpointClient

介面, 作為客戶端與OAuth2授權伺服器的令牌終端通訊。2個重要方法: sendPasswordGrant()和sendRefreshGrant()。

com.yourcompany.gateway.security.oauth2.OAuth2TokenEndpointClientAdapter

抽象類, 實現了OAuth2TokenEndpointClient的2個重要方法。定義了一個給請求頭中新增身份資訊的抽象方法addAuthentication()。

com.yourcompany.gateway.security.oauth2.UaaTokenEndpointClient

繼承OAuth2TokenEndpointClientAdapter,實現OAuth2TokenEndpointClient。 作為客戶端與UAA伺服器的令牌終端通訊,實現了addAuthentication()方法,從配置檔案中獲取如下配置,並放到請求頭中:

oauth2:
  web-client-configuration:
    client-id: web_app
    secret: changeit

注意:

  • 如果使用者登入沒有勾選“記住我”,cookie裡面的重新整理令牌的key為: cookie_token;如果勾選了“記住我”,cookie裡面的重新整理令牌的key為: refresh_token
  • 如果要嚴格判斷登出時間,需要通過快取中介軟體儲存logout登出資訊。

3.3 Identity

com.yourcompany.identity.client.AuthorizedFeignClient

註解。 為機器呼叫新增認證資訊。預設註冊攔截器OAuth2FeignRequestInterceptor。

com.yourcompany.identity.client.AuthorizedUserFeignClient

註解。為使用者呼叫新增認證資訊。預設註冊攔截器UserFeignClientInterceptor

com.yourcompany.identity.client.OAuth2InterceptedFeignConfiguration

註冊Oauth2RequestInterceptor。

com.yourcompany.identity.client.OAuth2UserClientFeignConfiguration

註冊UserFeignClientInterceptor。

com.yourcompany.identity.client.UserFeignClientInterceptor

攔截器, 給resttemplate的請求頭中新增認證資訊。

com.yourcompany.identity.config.MicroserviceSecurityConfiguration

註冊為資源伺服器,保護/api/和/management/等資源。

com.yourcompany.identity.security.oauth2.OAuth2SignatureVerifierClient

介面, 定義方法getSignatureVerifier(), 表示建立一個SignatureVerifier,用於獲取公鑰並驗證JWT令牌。

com.yourcompany.identity.security.oauth2.UaaSignatureVerifierClient

客戶端從UAA獲取公鑰並返回SignatureVerifier。實現了OAuth2SignatureVerifierClient介面的getSignatureVerifier()方法。