OAuth + Security - 4 - 客戶端信息存儲(chǔ)數(shù)據(jù)庫(kù)

PS:此文章為系列文章肴敛,建議從第一篇開(kāi)始閱讀。

在之前的所有配置中医男,我們的客戶端信息和授權(quán)碼模式下的授權(quán)碼任然還是存儲(chǔ)在數(shù)據(jù)庫(kù)中的,這樣就不利于我們后期的擴(kuò)展刀森,所以在正式的生成環(huán)境中报账,我們一般將其存儲(chǔ)在數(shù)據(jù)庫(kù)中研底。

建表

首先透罢,根據(jù)OAuth官方給的數(shù)據(jù)庫(kù)建表實(shí)例創(chuàng)建相應(yīng)的表,這里我們只需要oauth_client_details和oauth_code

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

INSERT INTO `oauth_client_details` VALUES ('dimples', 'res1',
'$2a$10$NlBC84MVb7F95EXYTXwLneXgCca6/GipyWR5NHm8K0203bSQMLpvm', 'all',
'client_credentials,password,authorization_code,implicit,refresh_token','http://www.baidu.com',
NULL,7200,259200,NULL,'2020-06-02 16:04:28',0,0,'false');

############################## oauth_code #################################
DROP TABLE IF EXISTS `oauth_code`;
CREATE TABLE `oauth_code`(
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`authentication` blob NULL,
INDEX `code_index`(`code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

此處的client_secret是加密過(guò)后的秘鑰

image

注意:官方給的標(biāo)準(zhǔn)SQL建表語(yǔ)句的數(shù)據(jù)庫(kù)是HSQL朽寞,實(shí)際使用需要根據(jù)數(shù)據(jù)庫(kù)類型自己修改

修改認(rèn)證服務(wù)器

  1. 修改客戶端配置
@Resource
private DataSource dataSource;

// 新增
@Bean
public ClientDetailsService clientDetailsService(DataSource dataSource) {
    ClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);
    ((JdbcClientDetailsService) clientDetailsService).setPasswordEncoder(passwordEncoder());
    return clientDetailsService;
}

// 修改
@Override
public void configure(ClientDetailsServiceConfigurer clients)throws Exception{
    clients.withClientDetails(clientDetailsService); 
}

同時(shí)需要添加jdbc的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
  1. 修改授權(quán)碼存儲(chǔ)配置
// 修改
@Bean
public AuthorizationCodeServices authorizationCodeServices(DataSource dataSource) { 
    //設(shè)置授權(quán)碼模式的授權(quán)碼如何存取
    return new JdbcAuthorizationCodeServices(dataSource);
}

擴(kuò)展

我們點(diǎn)開(kāi)JdbcClientDetailsService的源碼

public JdbcClientDetailsService(DataSource dataSource) {
    this.updateClientDetailsSql = DEFAULT_UPDATE_STATEMENT;
    this.updateClientSecretSql = "update oauth_client_details set client_secret = ? where client_id = ?";
    this.insertClientDetailsSql = "insert into oauth_client_details (client_secret, resource_ids, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove, client_id) values (?,?,?,?,?,?,?,?,?,?,?)";
    this.selectClientDetailsSql = "select client_id, client_secret, resource_ids, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove from oauth_client_details where client_id = ?";
    this.passwordEncoder = NoOpPasswordEncoder.getInstance();
    Assert.notNull(dataSource, "DataSource required");
    this.jdbcTemplate = new JdbcTemplate(dataSource);
    this.listFactory = new DefaultJdbcListFactory(new NamedParameterJdbcTemplate(this.jdbcTemplate));
}

通過(guò)上面的代碼喻频,我們可以發(fā)現(xiàn),實(shí)際上是源碼中已經(jīng)為我們寫好了對(duì)應(yīng)的增刪改查甥温,這也就意味著如果我們使用的數(shù)據(jù)庫(kù)的sql格式不支持膜宋,我們將無(wú)法獲取Token,那么我們?cè)趺唇鉀Q呢秋茫?官方也提供了方法:

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    JdbcClientDetailsService jdbcClientDetailsService = new JdbcClientDetailsService(dataSource);
    jdbcClientDetailsService.setFindClientDetailsSql("");
    clients.withClientDetails(jdbcClientDetailsService);
}

在配置客戶端信息的時(shí)候我們可以自定義SQL語(yǔ)句去替換默認(rèn)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圆兵,一起剝皮案震驚了整個(gè)濱河市枢贿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌局荚,老刑警劉巖愈污,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轮傍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡创夜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門驰吓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人檬贰,你說(shuō)我怎么就攤上這事∥痰樱” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵限书,是天一觀的道長(zhǎng)章咧。 經(jīng)常有香客問(wèn)我倦西,道長(zhǎng)赁严,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任卤档,我火速辦了婚禮,結(jié)果婚禮上劝枣,老公的妹妹穿的比我還像新娘织鲸。我一直安慰自己舔腾,他們只是感情好搂擦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扳还,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氨距。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音呈础,去河邊找鬼。 笑死而钞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臼节。 我是一名探鬼主播撬陵,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巨税,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了草添?” 一聲冷哼從身側(cè)響起扼仲,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屠凶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矗愧,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唉韭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纽哥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晓避,死狀恐怖簇捍,靈堂內(nèi)的尸體忽然破棺而出俏拱,到底是詐尸還是另有隱情,我是刑警寧澤锅必,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布搞隐,位于F島的核電站驹愚,受9級(jí)特大地震影響劣纲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癞季,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望志于。 院中可真熱鬧,春花似錦恨憎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至今瀑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橘荠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工挺份, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匀泊。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像各聘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躲因,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354