三 配置授權(quán)服務(wù)器

創(chuàng)建認(rèn)證服務(wù)auth

(1)引入依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.1.1.RELEASE</version>
</dependency>

第一步锋边、創(chuàng)建配置類

自定義配置類OAuth2AuthorizationServer,繼承AuthorizationServerConfigurerAdapter,添加注解
@Configuration
@EnableAuthorizationServer

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

}

重寫AuthorizationServerConfigurerAdapter中的三個(gè)方法,配置授權(quán)服務(wù)器

public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer {

    public AuthorizationServerConfigurerAdapter() {
    }

    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    }

    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    }

    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    }
}

這三個(gè)方法的作用:

ClientDetailsServiceConfigurer:
配置客戶端信息抹腿,客戶端信息在這里進(jìn)行初始化晕鹊,可以在這里寫死也可以通過(guò)數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)和調(diào)取

AuthorizationServerEndpointsConfigurer:
配置令牌服務(wù)和令牌的訪問(wèn)端點(diǎn)

AuthorizationServerSecurityConfigurer:
配置令牌端點(diǎn)的安全約束

第二步松却、配置客戶端信息

配置客戶端信息的 主要配置項(xiàng):
clientId:客戶端id
secret: 客戶端秘鑰
scope:允許的授權(quán)范圍
authorizedGrantTypes:允許客戶端使用的授權(quán)類型
authorities:客戶端可以使用的權(quán)限

客戶端信息 能夠在應(yīng)用程序運(yùn)行的時(shí)候進(jìn)行更新 可以使用內(nèi)存存儲(chǔ)也可以存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中

接下來(lái)演示用內(nèi)存的方式存儲(chǔ)客戶端信息,配置如下:

    /**
     * 配置基于內(nèi)存或JDBC的客戶端信息
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()// 使用內(nèi)存存儲(chǔ)
                .withClient("c1")//客戶端id
                .secret(new BCryptPasswordEncoder().encode("secret"))//客戶端秘鑰
                .resourceIds("res1")//資源列表
                /**
                 * 允許給客戶端授權(quán)的5種授權(quán)類型:
                 *  1 "authorization_code"  授權(quán)碼模式, 2 "password" 密碼模式, 3 "client_credentials" 客戶端模式
                 *  4 "implicit" 隱式模式, 5 "refresh_token" 刷新令牌
                 */
                .authorizedGrantTypes("authorization_code","password","client_credentials","implicit","refresh_token")

                .scopes("all")//允許的授權(quán)范圍
                .autoApprove(false) //false: 如果是授權(quán)碼模式 跳轉(zhuǎn)到授權(quán)頁(yè)面
                .redirectUris("http://www.baidu.com");//加上驗(yàn)證回調(diào)地址
    }

3捏题、令牌服務(wù)底層實(shí)現(xiàn)原理

(1)底層源碼分析:
AuthorizationServerTokenServices接口定義了一些操作使得你可以對(duì)令牌進(jìn)行一些必要的管理玻褪;

DefaultTokenServices是AuthorizationServerTokenServices的實(shí)現(xiàn)類,可以使用它來(lái)設(shè)置令牌的格式和令牌的存儲(chǔ)公荧;

默認(rèn)創(chuàng)建一個(gè)令牌時(shí),使用隨機(jī)值進(jìn)行填充同规,除了持久化令牌是委托一個(gè)TokenStore接口來(lái)實(shí)現(xiàn)以外循狰,其他功能都由DefaultTokenServices實(shí)現(xiàn);

TokenStore這個(gè)接口有一個(gè)默認(rèn)的實(shí)現(xiàn)類InMemoryTokenStore券勺,如其命名绪钥,所有的令牌都被保存在了內(nèi)存中。

(2)TokenStore的3個(gè)實(shí)現(xiàn)類簡(jiǎn)介:
InMemoryTokenStore:該實(shí)現(xiàn)類被默認(rèn)采用关炼,這種方式是將令牌保存到內(nèi)存中程腹,可以在開(kāi)發(fā)階段使用它做調(diào)試;

JdbcTokenStore:這是一個(gè)基于JDBC的實(shí)現(xiàn)類儒拂,令牌會(huì)被保存進(jìn)關(guān)系型數(shù)據(jù)庫(kù)寸潦。這種實(shí)現(xiàn)方式可以在不同的服務(wù)器之間共享令牌信息,使用該實(shí)現(xiàn)類要導(dǎo)入spring-jdbc依賴

JwtTokenStore:它可以把令牌相關(guān)的數(shù)據(jù)進(jìn)行編碼社痛,不需要進(jìn)行存儲(chǔ)

4见转、令牌服務(wù)代碼實(shí)現(xiàn)

    @Autowired
    ClientDetailsService clientDetailsService;

    @Autowired
    TokenStore tokenStore;

    @Bean
    public TokenStore tokenStore() {
        return new InMemoryTokenStore();
    }

    @Bean
    public AuthorizationServerTokenServices tokenServices() {
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setClientDetailsService(clientDetailsService);
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setTokenStore(tokenStore);
        tokenServices.setAccessTokenValiditySeconds(7200); //令牌默認(rèn)有效期2小時(shí)
        tokenServices.setRefreshTokenValiditySeconds(259200); //刷新令牌默認(rèn)有效期3天

        return tokenServices;
    }

5、令牌訪問(wèn)端點(diǎn)配置

(1)配置授權(quán)類型

authenticationManager:
用于密碼授權(quán)模式

authorizationCodeServices:
用于授權(quán)碼模式

implicitGrantService:
用于設(shè)置隱式授權(quán)模式

userDetailsService:
配置自定義的userDetailsService實(shí)現(xiàn)類

tokenGranter:
四種授權(quán)模式不滿足需求的情況下蒜哀,做擴(kuò)展增強(qiáng)
https://www.toobug.cn/post/2865.html

(2)配置授權(quán)端點(diǎn)的URL:

我們可以通過(guò)AuthorizationServerEndpointsConfigurer 對(duì)象的 pathMapping() 方法來(lái)配置端點(diǎn)URL鏈接斩箫,它有兩個(gè)參數(shù):
第一個(gè)參數(shù):String 類型,它是這個(gè)端點(diǎn)URL的默認(rèn)鏈接
第二個(gè)參數(shù):String 類型撵儿,它是你要替換的URL鏈接

框架的默認(rèn)URL鏈接如下:
/oauth/authorize:授權(quán)端點(diǎn)
/oauth/token:令牌端點(diǎn)
/oauth/confirm_access:用戶確認(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:如果使用的是JWT令牌乘客,則為 提供公有密匙的端點(diǎn)

需要注意的是授權(quán)端點(diǎn)這個(gè)URL應(yīng)該被spring security保護(hù)起來(lái),只供授權(quán)用戶訪問(wèn)

6淀歇、配置令牌端點(diǎn)的安全約束

AuthorizationServerSecurityConfigurer用來(lái)配置令牌端點(diǎn)的安全約束易核,配置如下:

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security
                 //tokenkey端點(diǎn)完全公開(kāi)
                .tokenKeyAccess("permitAll()")

                 //checkToken端點(diǎn)完全公開(kāi)
                .checkTokenAccess("permitAll()")
                 
                //允許表單認(rèn)證
                .allowFormAuthenticationForClients();
    }

web安全配置

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 為特定的Http請(qǐng)求配置基于Web的安全約束
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //關(guān)閉csrf
        http.csrf().disable()
                //不通過(guò)Session獲取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                //對(duì)于登錄接口,允許匿名訪問(wèn)
                .antMatchers("/user/login").anonymous() //匿名訪問(wèn)(未登錄可訪問(wèn)房匆,登錄后不可訪問(wèn))
                .antMatchers("/user/hello").hasAuthority("system:test:index")
                .anyRequest().authenticated();
        //允許跨域
        http.cors();
    }

    /**
     * 實(shí)例化AuthenticationManager對(duì)象耸成,將它注入spring容器
     */
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末报亩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子井氢,更是在濱河造成了極大的恐慌弦追,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花竞,死亡現(xiàn)場(chǎng)離奇詭異劲件,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)约急,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門零远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厌蔽,你說(shuō)我怎么就攤上這事牵辣。” “怎么了奴饮?”我有些...
    開(kāi)封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纬向,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我戴卜,道長(zhǎng)逾条,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任投剥,我火速辦了婚禮师脂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘江锨。我一直安慰自己吃警,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布泳桦。 她就那樣靜靜地躺著汤徽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灸撰。 梳的紋絲不亂的頭發(fā)上谒府,一...
    開(kāi)封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音浮毯,去河邊找鬼完疫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛债蓝,可吹牛的內(nèi)容都是我干的壳鹤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饰迹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芳誓!你這毒婦竟也來(lái)了余舶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锹淌,失蹤者是張志新(化名)和其女友劉穎匿值,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赂摆,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挟憔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烟号。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊谭。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汪拥,靈堂內(nèi)的尸體忽然破棺而出达传,到底是詐尸還是另有隱情,我是刑警寧澤喷楣,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布趟大,位于F島的核電站,受9級(jí)特大地震影響铣焊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罕伯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一曲伊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧追他,春花似錦坟募、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至单雾,卻和暖如春赚哗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硅堆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工屿储, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渐逃。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓够掠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親茄菊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疯潭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容