授權服務器配置
EnableAuthorizationServer
可以用@EnableAuthorizationServer注解并繼承AuthorizationServerConfigurationAdapter來配置OAuth2.0授權服務器夭拌。
在Config包下創(chuàng)建AuthorizationServer:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {
//略
}
AuthorizationServerConfigurationAdapter要求配置以下幾個類浅妆,這個幾個是由Spring創(chuàng)建的獨立的配置對象,它們會被Spring傳入AuthorizationServerConfiguration中進行配置泛范。
public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer {
public AuthorizationServerConfigurerAdapter() {
}
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
}
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
}
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
}
}
ClientDetailsServiceConfiguration :用來配置客戶端詳情服務(ClientDetailsService)酣倾,客戶端詳情信息在這里進行初始化苗桂,你能夠把客戶端詳情信息寫死在這里或者通過數(shù)據(jù)來存儲調取詳情信息矗烛。
AuthorizationServerEndpointsConfiguration :用來配置令牌(token)的訪問端點和令牌服務(token services)。
AuthorizationServerSecurityConfiguration :用來配置令牌端點的安全約束倒戏。
配置客戶端詳情信息
ClientDetailsServiceConfiguration能夠使用內存或者JDBC來實現(xiàn)客戶端詳情服務(ClientDetailsService)怠噪,ClientDetailsSevice負責查找ClientDetails,而ClientDetails有幾個重要的屬性如下列表:
clientId:(必須的)用來標識客戶的Id杜跷。
secret:(需要值得信任的客戶端)客戶端安全碼傍念,如果有的話矫夷。
scope:用來限制客戶端的訪問范圍,如果為空(默認)的話憋槐,那么客戶端擁有全部的訪問范圍双藕。
authorizationGrantTypes:此客戶端可以使用的授權類型,默認為空阳仔。
authorities:此客戶端可以使用權限(基于Spring Security authorities)蔓彩。
客戶端詳情(Client Details)能夠在應用程序運行的時候進行更新,可以通過訪問底層的存儲服務(例如將客戶端詳情存儲在一個關系數(shù)據(jù)庫的表中驳概,就可以使用JdbcClientDetailsService)或者通過自己實現(xiàn)clientRegistrationService接口(同時你也可以實現(xiàn)ClientDetailsService接口)來進行管理。
我們暫時使用內存方式存儲客戶端詳情信息旷赖,配置如下:
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//暫時使用內存方式
clients.inMemory()//使用in-memory存儲
.withClient("c1")//client_id
.secret(new BCryptPasswordEncoder().encode("secret"))//客戶端密鑰
.resourceIds("res1")//資源列表
.authorizedGrantTypes("authorization_code","password","client_credentials","implicit","refresh_token")//該client允許的授權的類型
.scopes("all")//允許范圍
.autoApprove(false)//false跳轉到授權頁面
.redirectUris("http://www.baidu.com");//加上驗證回調地址
}
管理令牌
AuthorizationServerTokenServices接口定義了一些操作使得你可以對令牌進行一些必要的管理顺又,令牌可以被用來加載身份信息,里面包含了這個令牌得相關權限等孵。
自己客可以創(chuàng)建AuthorizationSeerverTokenService這個接口的實現(xiàn)稚照,則需要繼承DefaultTokenServices這個類,里面包含了一些有用實現(xiàn)俯萌,你可使用它來修改令牌的格式和令牌的存儲果录。默認的,當它嘗試創(chuàng)建一個令牌的時候咐熙,是使用隨機值來進行填充的弱恒,除了持久化令牌是委托一個TokenStore接口來實現(xiàn)以外,這個類幾乎幫你做了所有的事情棋恼。并且TokenStore這個接口有一個默認的實現(xiàn)返弹,它就是InMemoryTokenStore,如其名爪飘,所有的令牌是被保存在了內存中义起。除了使用這個類以外,你還可以使用一些其他的預定義實現(xiàn)师崎,下面有幾個版本默终,它們都實現(xiàn)了TokenStore接口:
InMemoryTokenStore:這個版本的實現(xiàn)是被默認采用的,它可以完美的工作在單服務器上(即訪問并發(fā)量壓力不大的情況下犁罩,并且它在失敗的時候不會進行備份)齐蔽,大多數(shù)的項目都可以使用這個版本的實現(xiàn)來進行嘗試议谷,你可以在開發(fā)的時候使用它來進行管理俘陷,因為不會被保存到磁盤中,所以更易于調式硝皂。
JdbcTokenStore:這是個基于JDBC的實現(xiàn)版本顷窒,令牌會被保存進關系型數(shù)據(jù)庫蛙吏。使用這個版本的實現(xiàn)時源哩,你可以在不同的服務器之間共享令牌信息,使用這個版本的時候請注意把“spring-jdbc”這個依賴加入到你的classpath當中鸦做。
JwtTokenStore:這個版本的全程是JSON Web Token(JWT)励烦,它可以把令牌相關的數(shù)據(jù)庫進行編碼(因此對于后端服務來說,它不需要進行存儲泼诱,這將是一個重大優(yōu)勢)坛掠,但是它有一個缺點,那就是撤銷一個已經授權令牌將會非常困難治筒,所以它通常用來處理一個生命周期較短的令牌以及撤銷刷新令牌(refresh_token)屉栓。另外一個缺點就是這個令牌占用的空間會比較大,如果你加入了比較多用戶憑證信息耸袜。JwtTokenStore不會保存任何數(shù)據(jù)友多,但是它在轉換令牌值以及授權信息方面與DefaultTokenServices所扮演的角色是一樣的。
1.定義TokenConfig
在config包下定義TokenConfig堤框,我們暫時先使用InMemoryTokenStore生成一個普通的令牌域滥。
@Configuration
public class TokenConfig {
@Bean
public TokenStore tokenStore(){
return new InMemoryTokenStore();
}
}
2.定義AuthorizationServerTokenServices
在AuthorizationServer中定義AuthorizationServerTokenServices
@Autowired
private TokenStore tokenStore;
@Autowired
private ClientDetailsService clientDetailsService;
@Bean
public AuthorizationServerTokenServices tokenServices(){
DefaultTokenServices service=new DefaultTokenServices();
service.setClientDetailsService(clientDetailsService);//客戶端信信息的服務
service.setSupportRefreshToken(true);//是否產生刷新令牌
service.setTokenStore(tokenStore);//令牌存儲策略
service.setAccessTokenValiditySeconds(7200);//令牌默認有效期2小時
service.setRefreshTokenValiditySeconds(259200);//刷新令牌默認有效期3天
return service;
}
令牌訪問端點配置
AuthorizationServerEndpointsConfiguration這個對象的實例可以完成令牌服務以及令牌endpoint配置。
配置授權類型(Rant Types)
AuthorizationServerEndpointsConfiguration通過設定以下屬性決定支持的授權類型(Grant Types):
authorizationManager:認證管理器蜈抓,當你選擇了資源所有者密碼(password)授權類型的時候启绰,請設置這個屬性注入一個AuthorizationManager對象。
userDetailsService:如果你設置了這個屬性的話沟使,那說明你有一個自己的UserDetailsService接口的實現(xiàn)委可,或者你可以把這個定西設置到全局域上面去(例如GlobalAuthenticationManagerConfiguration這個配置對象),當你確保這個賬號是否仍然有效格带,假如你說禁用了這個賬戶的話撤缴。
authorizationCodeServices:這個屬性是用來設置授權碼服務的(即AuthorizationCodeService的實例對象),主要用于”authorization_code“授權碼類型模式叽唱。
implicitGrantService:這個屬性用于設置隱式授權模式屈呕,用來管理隱式授權模式的狀態(tài)。
tokenGranter:當你設置這個東西(即TokenGranter接口實現(xiàn))棺亭,那么授權將會交由你來完成掌握虎眨,并且會忽略掉上面幾個屬性,這個屬性一般是用作拓展用途的镶摘,即標準的四種授權模式已經滿足不了你的需求的時候嗽桩,才會考慮使用這個。
配置授權端點的URL(Endpoint URLs):
AuthorizationServerEndpsConfiguration這個配置對象有一個叫做pathMapping()方法用來配置端點URL鏈接凄敢,它有兩個參數(shù):
第一個參數(shù):String類型的碌冶,這個端點URL的默認鏈接。
第二個參數(shù):String類型的涝缝,你要進行替代的URL鏈接扑庞。
以上的參數(shù)都將以”/“字符為開始的字符串譬重,框架的默認URL鏈接如下列表,可以作為這個pathMapping()方法的第一個參數(shù):
/oauth/auothoriza:授權端點罐氨。
/oauth/token:令牌端點臀规。
/oauth/confirm_access:用戶確認授權提交端點。
/oauth/error:授權服務錯誤信息端點栅隐。
/oauth/token_key:提交公有密鑰的端點塔嬉,如果你使用JWT令牌的話。
需要注意的是授權端點這個URL應該被Spring Security保存起來只供授權用戶訪問租悄。
在AuthorizationServer配置令牌訪問端點
/**
* 令牌管理服務
* @return
*/
@Bean
public AuthorizationServerTokenServices tokenServices(){
DefaultTokenServices service=new DefaultTokenServices();
service.setClientDetailsService(clientDetailsService);//客戶端信信息的服務
service.setSupportRefreshToken(true);//是否產生刷新令牌
service.setTokenStore(tokenStore);//令牌存儲策略
service.setAccessTokenValiditySeconds(7200);//令牌默認有效期2小時
service.setRefreshTokenValiditySeconds(259200);//刷新令牌默認有效期3天
return service;
}
令牌端點的安全約束
AuthorizationServerSecurityConfigure :用來配置令牌端點(Token Endpoint)的安全約束谨究,在AuthorizationServer中配置如下。
/**
* 令牌訪問端點安全策略
* @param security
* @throws Exception
*/
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security
.tokenKeyAccess("permitAll()")//oauth/token_key公開
.checkTokenAccess("permitAll()")///oauth/check_token公開
.allowFormAuthenticationForClients();//表單認證泣棋,申請令牌
}
(1)tokenKey這個endpoint當使用JwtToken且使用非對稱加密時记盒,資源服務用于獲取公鑰而開發(fā)的,這里指這個endpoint完全公開
(2)checkToken這個endpoint完全公開
(3)允許表單認證
web安全配置
將Spring-Boot工程中的WebSecurityConfig拷貝到UAA工程中外傅。
最后編輯于 :2020.04.07 10:11:01
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者