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()方法。