29.OAuth2.0-Spring Cloud Security OAuth2-授權服務配置

授權服務器配置

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工程中外傅。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俩檬,隨后出現(xiàn)的幾起案子萎胰,更是在濱河造成了極大的恐慌,老刑警劉巖棚辽,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技竟,死亡現(xiàn)場離奇詭異,居然都是意外死亡屈藐,警方通過查閱死者的電腦和手機榔组,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來联逻,“玉大人搓扯,你說我怎么就攤上這事“椋” “怎么了锨推?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長公壤。 經常有香客問我换可,道長,這世上最難降的妖魔是什么厦幅? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任沾鳄,我火速辦了婚禮,結果婚禮上确憨,老公的妹妹穿的比我還像新娘译荞。我一直安慰自己瓤的,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布磁椒。 她就那樣靜靜地躺著堤瘤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浆熔。 梳的紋絲不亂的頭發(fā)上本辐,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音医增,去河邊找鬼慎皱。 笑死,一個胖子當著我的面吹牛叶骨,可吹牛的內容都是我干的茫多。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忽刽,長吁一口氣:“原來是場噩夢啊……” “哼天揖!你這毒婦竟也來了?” 一聲冷哼從身側響起跪帝,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤今膊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伞剑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑唬,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年黎泣,在試婚紗的時候發(fā)現(xiàn)自己被綠了恕刘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抒倚,死狀恐怖褐着,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情托呕,我是刑警寧澤献起,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站镣陕,受9級特大地震影響谴餐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜呆抑,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一岂嗓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹊碍,春花似錦厌殉、人聲如沸食绿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽器紧。三九已至,卻和暖如春楼眷,著一層夾襖步出監(jiān)牢的瞬間铲汪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工罐柳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掌腰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓张吉,卻偏偏與公主長得像齿梁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肮蛹,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容