OAuth2.0-完善環(huán)境配置

截止目前客戶端信息和授權(quán)碼仍然存儲(chǔ)在內(nèi)存中属韧,生產(chǎn)環(huán)境中通常會(huì)存儲(chǔ)在數(shù)據(jù)庫中述吸,下邊將完善環(huán)境的配置。

一、創(chuàng)建表

1登舞、接入客戶端信息表 oauth_client_details

CREATE TABLE `oauth_client_details` (
  `client_id` varchar(255) COLLATE utf8_croatian_ci NOT NULL COMMENT '客戶端標(biāo)識(shí)',
  `resource_ids` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '接入資源列表',
  `client_secret` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL COMMENT '客戶端秘鑰',
  `scope` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL,
  `authorized_grant_types` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL,
  `web_server_redirect_uri` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL,
  `authorities` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` longtext COLLATE utf8_croatian_ci,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `archived` tinyint(4) DEFAULT NULL,
  `trusted` tinyint(4) DEFAULT NULL,
  `autoapprove` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL,
  PRIMARY KEY (`client_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_croatian_ci ROW_FORMAT=DYNAMIC COMMENT='接入客戶端信息';

-- 初始化數(shù)據(jù)
INSERT INTO oauth2.oauth_client_details (client_id, resource_ids, client_secret, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, create_time, archived, trusted, autoapprove) VALUES ('c1', 'res1', '$2a$10$iDXj8iLaUNVZoJ2M5xkkb./o25cvWpNvB6cqmDBBeiRcDOBCnSf/.', 'ROLE_ADMIN,ROLE_USER,ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'http://www.baidu.com', null, 7200, 259200, null, '2019-12-08 09:55:11', 0, 0, 'false');
INSERT INTO oauth2.oauth_client_details (client_id, resource_ids, client_secret, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, create_time, archived, trusted, autoapprove) VALUES ('c2', 'res2', '$2a$10$iDXj8iLaUNVZoJ2M5xkkb./o25cvWpNvB6cqmDBBeiRcDOBCnSf/.', 'ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'http://www.baidu.com', null, 3153600, 25920000, null, '2019-09-09 21:48:51', 0, 0, 'false');

2贰逾、授權(quán)碼表 oauth_code Spring Security OAuth2使用,用來存儲(chǔ)授權(quán)碼

CREATE TABLE `oauth_code` (
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `code` varchar(255) COLLATE utf8_croatian_ci DEFAULT NULL,
  `authentication` blob,
  KEY `code_index` (`code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_croatian_ci ROW_FORMAT=COMPACT;

二菠秒、配置權(quán)限服務(wù)

1疙剑、修改AuthorizationServer
ClientDetailsServiceAuthorizationCodeServices從數(shù)據(jù)庫中讀取數(shù)據(jù)。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    /**
     * 在 TokenConfig 中已經(jīng)注入
     */
    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private ClientDetailsService clientDetailsService;

    /**
     * 本類中注入
     */
    @Autowired
    private AuthorizationCodeServices authorizationCodeServices;

    /**
     * 在 WebSecurityConfig 中已經(jīng)注入
     */
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * 在 TokenConfig 中已經(jīng)注入
     */
    @Autowired
    private JwtAccessTokenConverter accessTokenConverter;

    /**
     * 在 WebSecurityConfig 中已經(jīng)注入
     */
    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * 將客戶端信息存儲(chǔ)到數(shù)據(jù)庫
     * @param dataSource
     * @return
     */
    @Bean
    public ClientDetailsService clientDetailsService(DataSource dataSource) {
        JdbcClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);
        clientDetailsService.setPasswordEncoder(passwordEncoder);
        return clientDetailsService;
    }

    /**
     * 將客戶端信息存儲(chǔ)到內(nèi)存中
     * @return ClientDetailsService
     */
    /*@Bean
    public ClientDetailsService clientDetailsService() {
        return new InMemoryClientDetailsService();
    }*/

    /**
     * 配置客戶端詳情信息服務(wù)
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

        // clientDetailsService使用jdbc查詢數(shù)據(jù)庫的方式
        clients.withClientDetails(clientDetailsService);

        // 使用in-memory存儲(chǔ)
        /*clients.inMemory()
                // client_id
                .withClient("c1")
                // 客戶端秘鑰
                .secret(new BCryptPasswordEncoder().encode("secret"))
                // 客戶端可以訪問的資源列表
                .resourceIds("res1")
                // 該client允許的授權(quán)范圍(所有支持的5種)
                .authorizedGrantTypes("authorization_code", "password", "client_credentials", "implicit", "refresh_token")
                // 允許的授權(quán)范圍(客戶端的權(quán)限)践叠,user-service言缤、read等標(biāo)識(shí)
                .scopes("all")
                // false:授權(quán)碼模式,跳轉(zhuǎn)到授權(quán)的頁面禁灼,如果是true管挟,不用跳轉(zhuǎn)頁面
                .autoApprove(false)
                // 加上驗(yàn)證回調(diào)地址
                .redirectUris("http://www.baidu.com");*/
                // 另外一套
                // .and()
                // // client_id
                // .withClient("c1")
                // // 客戶端秘鑰
                // .secret(new BCryptPasswordEncoder().encode("secret"))
                // // 客戶端可以訪問的資源列表
                // .resourceIds("res1")
                // // 該client允許的授權(quán)范圍(所有支持的5種)
                // .authorizedGrantTypes("authorization_code", "password", "client_credentials", "implicit", "refresh_token")
                // // 允許的授權(quán)范圍(客戶端的權(quán)限),user-service弄捕、read等標(biāo)識(shí)
                // .scopes("all")
                // // false:授權(quán)碼模式僻孝,跳轉(zhuǎn)到授權(quán)的頁面导帝,如果是true,不用跳轉(zhuǎn)頁面
                // .autoApprove(false)
                // // 加上驗(yàn)證回調(diào)地址
                // .redirectUris("http://www.baidu.com");

    }

    /**
     * 令牌管理服務(wù)
     * @return
     */
    @Bean
    public AuthorizationServerTokenServices tokenService() {
        DefaultTokenServices service = new DefaultTokenServices();
        // 客戶端詳情服務(wù)
        service.setClientDetailsService(clientDetailsService);
        // 是否產(chǎn)生支持刷新令牌
        service.setSupportRefreshToken(true);
        // 令牌存儲(chǔ)策略
        service.setTokenStore(tokenStore);

        // 設(shè)置令牌增強(qiáng)
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Collections.singletonList(accessTokenConverter));
        service.setTokenEnhancer(tokenEnhancerChain);

        // 令牌桶默認(rèn)有效期2小時(shí)
        service.setAccessTokenValiditySeconds(7200);
        // 刷新令牌默認(rèn)有效期3天
        service.setRefreshTokenValiditySeconds(259200);
        return service;
    }

    /**
     * 令牌端點(diǎn)的安全配置
     * @param security
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        // /oauth/token_key: 這個(gè)endpoint當(dāng)使用jwttoken且使用非對稱加密時(shí)穿铆,資源服務(wù)器用于獲取公鑰而開放的您单,這里指這個(gè)endpoint完全公開
        security.tokenKeyAccess("permitAll()")
                // oauth/check_token: checkToken這個(gè)endpoint完全公開
                .checkTokenAccess("permitAll()")
                // 允許表單認(rèn)證
                .allowFormAuthenticationForClients();
    }

    /**
     * 設(shè)置授權(quán)碼模式的授權(quán)碼如何存取,暫時(shí)采用內(nèi)存方式
     * @return
     */
    /*@Bean
    public AuthorizationCodeServices authorizationCodeServices() {
        // 內(nèi)存方式
        return new InMemoryAuthorizationCodeServices();
    }*/

    @Bean
    public AuthorizationCodeServices authorizationCodeServices(DataSource dataSource) {
        // 設(shè)置授權(quán)碼模式的授權(quán)碼如何存儲(chǔ):數(shù)據(jù)庫方式
        return new JdbcAuthorizationCodeServices(dataSource);
    }

    /**
     * 令牌訪問端點(diǎn)
     * tokenService():令牌管理服務(wù)
     * @param endpoints
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        // authenticationManager:認(rèn)證管理器荞雏,密碼模式
        // authorizationCodeServices:授權(quán)碼服務(wù)
        endpoints.authenticationManager(authenticationManager)
                .authorizationCodeServices(authorizationCodeServices)
                // 令牌管理服務(wù)虐秦,都需要
                .tokenServices(tokenService())
                // 允許的POST提交
                .allowedTokenEndpointRequestMethods(HttpMethod.POST);
    }
}
授權(quán)獲取JWT令牌
校驗(yàn)JWT令牌

瀏覽器訪問:http://127.0.0.1:53020/uaa/oauth/authorize?client_id=c1&response_type=code&redirect_uri=http://www.baidu.com,如果沒有指定scope凤优,默認(rèn)就是全部的scope悦陋,如果指定具體的scope則為http://127.0.0.1:53020/uaa/oauth/authorize?client_id=c1&scope=ROLE_API&response_type=code&redirect_uri=http://www.baidu.com如下:

指定scope授權(quán)
自動(dòng)重定向到登錄頁面
授權(quán)頁面
授權(quán)碼
通過授權(quán)碼獲取token
驗(yàn)證token
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市别洪,隨后出現(xiàn)的幾起案子叨恨,更是在濱河造成了極大的恐慌,老刑警劉巖挖垛,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒钝,死亡現(xiàn)場離奇詭異,居然都是意外死亡痢毒,警方通過查閱死者的電腦和手機(jī)送矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哪替,“玉大人栋荸,你說我怎么就攤上這事∑静埃” “怎么了晌块?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帅霜。 經(jīng)常有香客問我匆背,道長,這世上最難降的妖魔是什么身冀? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任钝尸,我火速辦了婚禮,結(jié)果婚禮上搂根,老公的妹妹穿的比我還像新娘珍促。我一直安慰自己,他們只是感情好剩愧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布猪叙。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沐悦。 梳的紋絲不亂的頭發(fā)上成洗,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音藏否,去河邊找鬼瓶殃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛副签,可吹牛的內(nèi)容都是我干的遥椿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼淆储,長吁一口氣:“原來是場噩夢啊……” “哼冠场!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起本砰,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤碴裙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后点额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舔株,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年还棱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了载慈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珍手,死狀恐怖办铡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琳要,我是刑警寧澤寡具,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站稚补,受9級(jí)特大地震影響童叠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孔厉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帖努。 院中可真熱鬧撰豺,春花似錦、人聲如沸拼余。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匙监。三九已至凡橱,卻和暖如春小作,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稼钩。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工顾稀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坝撑。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓静秆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巡李。 傳聞我的和親對象是個(gè)殘疾皇子抚笔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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