spring-security-oauth2(授權(quán)服務(wù)器)
1授權(quán)服務(wù)配置
配置一個(gè)授權(quán)服務(wù)锁荔,需要考慮 授權(quán)類(lèi)型(GrantType)、不同授權(quán)類(lèi)型為客戶(hù)端(Client)提供了不同的獲取令牌(Token)方式贱迟,每一個(gè)客戶(hù)端(Client)都能夠通過(guò)明確的配置以及權(quán)限來(lái)實(shí)現(xiàn)不同的授權(quán)訪問(wèn)機(jī)制,也就是說(shuō)如果你提供了一個(gè) “client_credentials” 授權(quán)方式,并不意味著其它客戶(hù)端就要采用這種方式來(lái)授權(quán)
使用 @EnableAuthorizationServer 來(lái)配置授權(quán)服務(wù)機(jī)制,并繼承 AuthorizationServerConfigurerAdapter 該類(lèi)重寫(xiě) configure 方法定義授權(quán)服務(wù)器策略
2配置客戶(hù)端詳情(Client Details)
ClientDetailsServiceConfigurer 能夠使用內(nèi)存或 JDBC 方式實(shí)現(xiàn)獲取已注冊(cè)的客戶(hù)端詳情百拓,有幾個(gè)重要的屬性:
clientId:客戶(hù)端標(biāo)識(shí) ID
secret:客戶(hù)端安全碼
scope:客戶(hù)端訪問(wèn)范圍琴锭,默認(rèn)為空則擁有全部范圍
authorizedGrantTypes:客戶(hù)端使用的授權(quán)類(lèi)型,默認(rèn)為空
authorities:客戶(hù)端可使用的權(quán)限
3管理令牌(Managing Token)
ResourceServerTokenServices 接口定義了令牌加載耐版、讀取方法
AuthorizationServerTokenServices 接口定義了令牌的創(chuàng)建祠够、獲取压汪、刷新方法
ConsumerTokenServices 定義了令牌的撤銷(xiāo)方法
DefaultTokenServices 實(shí)現(xiàn)了上述三個(gè)接口,它包含了一些令牌業(yè)務(wù)的實(shí)現(xiàn)粪牲,如創(chuàng)建令牌、讀取令牌止剖、刷新令牌腺阳、獲取客戶(hù)端ID。默認(rèn)的當(dāng)嘗試創(chuàng)建一個(gè)令牌時(shí)穿香,是使用 UUID 隨機(jī)值進(jìn)行填充的亭引,除了持久化令牌是委托一個(gè) TokenStore 接口實(shí)現(xiàn)以外,這個(gè)類(lèi)幾乎幫你做了所有事情
而 TokenStore 接口也有一些實(shí)現(xiàn):
InMemoryTokenStore:默認(rèn)采用該實(shí)現(xiàn),將令牌信息保存在內(nèi)存中,易于調(diào)試
JdbcTokenStore:令牌會(huì)被保存近關(guān)系型數(shù)據(jù)庫(kù)撕瞧,可以在不同服務(wù)器之間共享令牌
JwtTokenStore:使用 JWT 方式保存令牌注服,它不需要進(jìn)行存儲(chǔ),但是它撤銷(xiāo)一個(gè)已經(jīng)授權(quán)令牌會(huì)非常困難呻率,所以通常用來(lái)處理一個(gè)生命周期較短的令牌以及撤銷(xiāo)刷新令牌
4JWT 令牌(JWT Tokens)
使用 JWT 令牌需要在授權(quán)服務(wù)中使用 JWTTokenStore,資源服務(wù)器也需要一個(gè)解碼 Token 令牌的類(lèi) JwtAccessTokenConverter,JwtTokenStore 依賴(lài)這個(gè)類(lèi)進(jìn)行編碼以及解碼宏浩,因此授權(quán)服務(wù)以及資源服務(wù)都需要配置這個(gè)轉(zhuǎn)換類(lèi)
Token 令牌默認(rèn)是有簽名的,并且資源服務(wù)器中需要驗(yàn)證這個(gè)簽名靠瞎,因此需要一個(gè)對(duì)稱(chēng)的 Key 值比庄,用來(lái)參與簽名計(jì)算
這個(gè) Key? 值存在于授權(quán)服務(wù)和資源服務(wù)之中,或者使用非對(duì)稱(chēng)加密算法加密 Token 進(jìn)行簽名乏盐,Public Key 公布在 /oauth/token_key 這個(gè) URL 中
默認(rèn) /oauth/token_key 的訪問(wèn)安全規(guī)則是 "denyAll()" 即關(guān)閉的佳窑,可以注入一個(gè)標(biāo)準(zhǔn)的 SpingEL 表達(dá)式到 AuthorizationServerSecurityConfigurer 配置類(lèi)中將它開(kāi)啟,例如 permitAll()
需要引入 spring-security-jwt 庫(kù)
5配置授權(quán)類(lèi)型(Grant Types)
授權(quán)是使用 AuthorizationEndpoint 這個(gè)端點(diǎn)來(lái)進(jìn)行控制的父能,使用 AuthorizationServerEndpointsConfigurer 這個(gè)對(duì)象實(shí)例來(lái)進(jìn)行配置华嘹,默認(rèn)是支持除了密碼授權(quán)外所有標(biāo)準(zhǔn)授權(quán)類(lèi)型,它可配置以下屬性:
authenticationManager:認(rèn)證管理器法竞,當(dāng)你選擇了資源所有者密碼(password)授權(quán)類(lèi)型的時(shí)候耙厚,請(qǐng)?jiān)O(shè)置這個(gè)屬性注入一個(gè) AuthenticationManager 對(duì)象
userDetailsService:可定義自己的 UserDetailsService 接口實(shí)現(xiàn)
authorizationCodeServices:用來(lái)設(shè)置收取碼服務(wù)的(即 AuthorizationCodeServices 的實(shí)例對(duì)象),主要用于 "authorization_code" 授權(quán)碼類(lèi)型模式
implicitGrantService:這個(gè)屬性用于設(shè)置隱式授權(quán)模式岔霸,用來(lái)管理隱式授權(quán)模式的狀態(tài)
tokenGranter:完全自定義授權(quán)服務(wù)實(shí)現(xiàn)(TokenGranter 接口實(shí)現(xiàn))薛躬,只有當(dāng)標(biāo)準(zhǔn)的四種授權(quán)模式已無(wú)法滿(mǎn)足需求時(shí)
6配置授權(quán)端點(diǎn) URL(Endpoint URLs)
AuthorizationServerEndpointsConfigurer 配置對(duì)象有一個(gè) pathMapping() 方法用來(lái)配置端點(diǎn)的 URL,它有兩個(gè)參數(shù):
參數(shù)一:端點(diǎn) URL 默認(rèn)鏈接
參數(shù)二:替代的 URL 鏈接
下面是一些默認(rèn)的端點(diǎn) URL:
/oauth/authorize:授權(quán)端點(diǎn)
/oauth/token:令牌端點(diǎn)
/oauth/confirm_access:用戶(hù)確認(rèn)授權(quán)提交端點(diǎn)
/oauth/error:授權(quán)服務(wù)錯(cuò)誤信息端點(diǎn)
/oauth/check_token:用于資源服務(wù)訪問(wèn)的令牌解析端點(diǎn)
/oauth/token_key:提供公有密匙的端點(diǎn)呆细,如果你使用JWT令牌的話
授權(quán)端點(diǎn)的 URL 應(yīng)該被 Spring Security 保護(hù)起來(lái)只供授權(quán)用戶(hù)訪問(wèn)