Authorization Server 認(rèn)證服務(wù)

HiAuth是一個(gè)開(kāi)源的基于Oauth2協(xié)議的認(rèn)證芭析、授權(quán)系統(tǒng)锚扎,除了標(biāo)準(zhǔn)的Oauth2授權(quán)流程功能外,還提供了應(yīng)用管理馁启、用戶管理驾孔、權(quán)限管理等相關(guān)功能芍秆。

在這個(gè)項(xiàng)目中你能夠了解到如何基于spring-security-oauth2-authorization-server實(shí)現(xiàn)自己的Authorization Server 認(rèn)證服務(wù)、資源服務(wù)器以及如何第三方集成翠勉,本項(xiàng)目基于SpringBoot 3.0 版本開(kāi)發(fā)妖啥。

項(xiàng)目源碼地址:https://github.com/bestaone/HiAuth

介紹

除了認(rèn)證相關(guān)功能外,還提供了hiauth-mall对碌、hiauth-mgr-svc項(xiàng)目荆虱,供用戶參考如何集成。

  • 參考hiauth-mall朽们,你可以了解如何在第三方應(yīng)用中集成hiauth授權(quán)服務(wù)怀读;
  • 參考hiauth-mgr-svc項(xiàng)目,你可以快速的啟動(dòng)一個(gè)微服務(wù)項(xiàng)目的框架搭建华坦,亦可以在這里找到一些技術(shù)的最佳實(shí)踐愿吹,為你的項(xiàng)目開(kāi)發(fā)提供參考;

HiAuth 2.0 升級(jí)到 3.0 的升級(jí)內(nèi)容

  • SpringBoot 3.0.2
  • spring-security-oauth2-authorization-server 1.0.0
  • mybatis-plus 3.5.3.1

調(diào)整比較大的地方

  • SpringSecurity升級(jí)到6.0版本后惜姐,用法有不少改動(dòng)
  • SpringSecurity5以后已不再支持Authorization Server犁跪,取而代之的事spring-security-oauth2-authorization-server 項(xiàng)目
  • 前端從vue-element-admin換成了AntDesignPro

如果你覺(jué)得此項(xiàng)目有價(jià)值,請(qǐng)給我點(diǎn)個(gè)star歹袁,謝謝坷衍!

目錄結(jié)構(gòu)

├─doc                  文檔目錄,架構(gòu)設(shè)計(jì)条舔、數(shù)據(jù)庫(kù)設(shè)計(jì)...
├─cicd                 持續(xù)集成相關(guān)腳本
├─hiauth-parent        統(tǒng)一管理依賴(必選)
├─hiauth-server        hiauth認(rèn)證服務(wù)(必選)
├─hiauth-resource      hiauth資源管理服務(wù)枫耳,參考如何集成資源服務(wù)(參考)
├─hiauth-himall        himall是一個(gè)demo,參考此項(xiàng)目了解如何集成hiauth(參考)
├─hiauth-mgr-svc       hiauth管理端后臺(tái)服務(wù)孟抗,基于SpringBoot(可選)
├─hiauth-mgr-fornt     hiauth管理端前端代碼迁杨,基于AntDesignPro(可選)

功能

  • 這個(gè)項(xiàng)目可以幫你實(shí)現(xiàn)基于Oauth2協(xié)議的統(tǒng)一認(rèn)證、授權(quán)系統(tǒng)凄硼;
  • 這個(gè)項(xiàng)目可以幫助你快速的啟動(dòng)一個(gè)基于SpringBoot技術(shù)棧的微服務(wù)框架搭建铅协;
  • 如果你僅僅使用到了Oauth2協(xié)議的統(tǒng)一認(rèn)證、授權(quán)系統(tǒng)功能摊沉,那么你用技術(shù)可以是除java外的技術(shù)棧狐史;
  • himall演示了authorization_code模式,HiAuth支持了用戶名密碼说墨、手機(jī)號(hào)短信兩種認(rèn)證方式骏全;
  • 發(fā)送短信、登錄接口實(shí)現(xiàn)了圖形驗(yàn)證碼防刷功能尼斧;
  • HiAuth是一個(gè)前后端分離項(xiàng)目姜贡,前端使用了ReactAntDesign技術(shù)棺棵,參考這個(gè)項(xiàng)目鲁豪,你可以自定義開(kāi)發(fā)管理后端潘悼;
  • 基于SpringBoot項(xiàng)目更容易集成到多個(gè)平臺(tái)(SpringCloud、K8S爬橡、Istio);
  • 演示了如何統(tǒng)一控制接口規(guī)范棒动;
  • 演示了如何規(guī)范異常處理糙申;
  • 演示了如何規(guī)范使用MyBaits-Plus、分頁(yè)船惨;
  • 演示了單元測(cè)試柜裸、mock測(cè)試、測(cè)試數(shù)據(jù)回滾粱锐,包括對(duì)controller疙挺、service的測(cè)試;

截圖

  • HiMall


    HiMall
  • UMC

前端從vue-element-admin換成了AntDesignPro截圖還沒(méi)來(lái)得及做新的

UMC

LIVE DEMO

快速啟動(dòng)

環(huán)境需求

  • JDK17+
  • Maven 3.8.6
  • MySQL 8
  • Redis
  • NodeJS v16+(<v18)
  • Yarn 1.22.4

下載源碼

>git clone https://github.com/bestaone/HiAuth.git

創(chuàng)建數(shù)據(jù)庫(kù)

在你的mysql數(shù)據(jù)庫(kù)中創(chuàng)建庫(kù)hiauth怜浅,并執(zhí)行下面腳本:

> HiAuth\doc\hiauth.sql

# 也可以從JAR自己提取相關(guān)表結(jié)構(gòu)
# org.springframework.security.oauth2.server.authorization.client/oauth2-registered-client-schema.sql
# org.springframework.security.oauth2.server.authorization/oauth2-authorization-consent-schema.sql
# org.springframework.security.oauth2.server.authorization/oauth2-authorization-schema.sql

調(diào)整配置

需要調(diào)整的配置有數(shù)據(jù)庫(kù)铐然、redis,默認(rèn)會(huì)使用native.properties配置恶座,如果和你的環(huán)境不一致搀暑。

請(qǐng)修改:

# 需要將如下兩個(gè)文件中的mysql、redis的配置改成自己的
# HiAuth\hiauth-server\src\main\properties\native.properties
# HiAuth\hiauth-mgr-svc\src\main\properties\native.properties

app.host=http://127.0.0.1:8080

database.url=jdbc:mysql://mysql-server:3306/hiauth3?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
database.username=dev
database.password=123456

redis.host=redis-server
redis.port=6379
redis.database=8
redis.password=

添加host

# IP 換成你自己的
127.0.0.1 redis-server
127.0.0.1 mysql-server

構(gòu)建跨琳、啟動(dòng)

# 編譯后臺(tái)自点,會(huì)執(zhí)行單元測(cè)試,需要正確配置數(shù)據(jù)庫(kù)和redis
>cd HiAuth
>mvn clean install

# 構(gòu)建前端并啟動(dòng)
>cd HiAuth\hiauth-mgr-front
>yarn install
>yarn start

# 啟動(dòng)hiauth授權(quán)服務(wù)端
>cd HiAuth\hiauth-server
>mvn spring-boot:run

# 啟動(dòng)hiauth資源服務(wù)端
>cd HiAuth\hiauth-resource
>mvn spring-boot:run

# 啟動(dòng)himall
>cd HiAuth\hiauth-himall
>mvn spring-boot:run

# 啟動(dòng)hiauth管理后端
>cd HiAuth\hiauth-mgr-svc
>mvn spring-boot:run

驗(yàn)證

驗(yàn)證登錄

  • 訪問(wèn)HiMall:http://127.0.0.1:8081
  • 訪問(wèn)Server:http://127.0.0.1:8080
  • 訪問(wèn)Manager:http://127.0.0.1:8080 (具體端口看前端項(xiàng)目啟動(dòng)后的控制臺(tái)輸出)

驗(yàn)證Swagger

{
  "error": "unauthorized",
  "error_description": "Full authentication is required to access this resource"
}
  • 點(diǎn)擊認(rèn)證按鈕桂敛,會(huì)被重定向到登錄,輸入賬號(hào)登錄進(jìn)行認(rèn)證
  • 認(rèn)證成功后被重定向回swagger頁(yè)面
  • 再次測(cè)試接口溅潜,獲取正確數(shù)據(jù)

驗(yàn)證Oauth2流程

authorization_code 認(rèn)證流程

  • 在瀏覽器中輸入如下地址术唬,會(huì)調(diào)到登錄頁(yè),登錄完成后會(huì)跳轉(zhuǎn)到百度伟恶,在瀏覽器url中把code碼復(fù)制出來(lái)
http://127.0.0.1:8080/oauth2/authorize?client_id=demo-client-id&response_type=code&scope=user_info&redirect_uri=http://www.baidu.com
  • 使用上面獲取的code換取accessToken
curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=authorization_code&code=code&redirect_uri=http://www.baidu.com' \
  --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
{
    "access_token": "xxxxxx",
    "refresh_token": "yyyyy",
    "scope": "user_info",
    "token_type": "Bearer",
    "expires_in": 7199
}

Authorization = Basic base64.encode(client_id:client_secret)可以在網(wǎng)上找個(gè)在線工具生成碴开,或者直接用postman測(cè)試,Authorization選擇Basic Auth博秫,填入對(duì)應(yīng)值即可

  • 訪問(wèn)受控接口潦牛,不帶accessToken,返回401挡育,未授權(quán)
>curl --location --request POST 'http://127.0.0.1:8082/user/info'
{
    "error": "unauthorized",
    "error_description": "Full authentication is required to access this resource"
}
  • 訪問(wèn)受控接口巴碗,攜帶accessToken,返回?cái)?shù)據(jù)
curl --location --request POST 'http://127.0.0.1:8082/user/info' --header 'Authorization: Bearer token'
{
    "name":"Resource"
}

refresh_token

curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=refresh_token&refresh_token=refresh_token' \
  --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
{
    "access_token": "xxxxxx",
    "refresh_token": "yyyyy",
    "scope": "user_info",
    "token_type": "Bearer",
    "expires_in": 6152
}
client_credentials 認(rèn)證流程
  • 使用POST訪問(wèn)獲取access_token接口即寒,設(shè)置grant_type=client_credentials
curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=client_credentials&scope=user_info' \
    --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
{
    "access_token": "xxxxxx",
    "scope": "user_info",
    "token_type": "Bearer",
    "expires_in": 7199
}
scop權(quán)限范圍驗(yàn)證
  • 使用POST訪問(wèn)獲取access_token接口,設(shè)置grant_type=client_credentials橡淆,scope=message.read
> curl --location --request POST 'http://127.0.0.1:8080/oauth2/token?grant_type=client_credentials&scope=message.read' --header 'Authorization: Basic ZGVtby1jbGllbnQtaWQ6ZGVtby1jbGllbnQtc2VjcmV0'
# 返回的 token 的權(quán)限范圍是 message.read
{
    "access_token": "xxxxxx",
    "scope": "message.read",
    "token_type": "Bearer",
    "expires_in": 7199
}
  • 使用擁有message.read權(quán)限的toke訪問(wèn)用戶接口召噩,被拒絕,提示無(wú)權(quán)限
curl --location --request POST 'http://127.0.0.1:8082/user/info' --header 'Authorization: Bearer token'
{
    "error": "insufficient_scope",
    "error_description": "Insufficient scope for this resource",
    "scope": "user_info"
}

所有的127.0.0.1不能使用localhost代替逸爵,因?yàn)閍uth會(huì)檢查域名的合法性具滴,數(shù)據(jù)庫(kù)中登記的是127.0.0.1

集成認(rèn)證、授權(quán)服務(wù)

這里為了演示如何集成HiAuth师倔、提供了一個(gè)Demo項(xiàng)目HiMall构韵。

HiMall

HiMall是基于SpringBoot技術(shù)的微服務(wù)項(xiàng)目,其集成了HiAuth的認(rèn)證趋艘、授權(quán)疲恢。

環(huán)境需求

  • JDK17+
  • HiAuth3

安裝、啟動(dòng)

#編譯瓷胧、構(gòu)建項(xiàng)目
>cd HiAuth\hiaut-himall
>mvn clean install
>mvn spring-boot:run

驗(yàn)證authorization_code模式認(rèn)證

  • 訪問(wèn)地址:http://127.0.0.1:8081
  • 點(diǎn)擊Login显拳,會(huì)被重定向到HiAuth系統(tǒng)進(jìn)行認(rèn)證
  • 認(rèn)證通過(guò)后會(huì)被重定向回HiMall,此時(shí)HiMall也將持有登錄狀態(tài)

授權(quán)協(xié)議

本項(xiàng)目執(zhí)行 MIT 協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搓萧,一起剝皮案震驚了整個(gè)濱河市杂数,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矛绘,老刑警劉巖耍休,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異货矮,居然都是意外死亡羊精,警方通過(guò)查閱死者的電腦和手機(jī)吟逝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門宰翅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灾常,“玉大人或南,你說(shuō)我怎么就攤上這事属桦』莺眨” “怎么了终蒂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵席里,是天一觀的道長(zhǎng)铃在。 經(jīng)常有香客問(wèn)我阵具,道長(zhǎng),這世上最難降的妖魔是什么定铜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任阳液,我火速辦了婚禮,結(jié)果婚禮上揣炕,老公的妹妹穿的比我還像新娘帘皿。我一直安慰自己,他們只是感情好畸陡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布鹰溜。 她就那樣靜靜地躺著虽填,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曹动。 梳的紋絲不亂的頭發(fā)上斋日,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音仁期,去河邊找鬼桑驱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跛蛋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痊硕,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赊级,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了岔绸?” 一聲冷哼從身側(cè)響起理逊,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盒揉,沒(méi)想到半個(gè)月后晋被,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刚盈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年羡洛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藕漱。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欲侮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肋联,到底是詐尸還是另有隱情威蕉,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布橄仍,位于F島的核電站韧涨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侮繁。R本人自食惡果不足惜虑粥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鼎天。 院中可真熱鬧舀奶,春花似錦、人聲如沸斋射。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涧至,卻和暖如春腹躁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背南蓬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工纺非, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赘方。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓烧颖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窄陡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炕淮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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