Spring Cloud Security:Oauth2使用入門

Spring Cloud Security 為構(gòu)建安全的SpringBoot應(yīng)用提供了一系列解決方案省容,結(jié)合Oauth2可以實(shí)現(xiàn)單點(diǎn)登錄、令牌中繼燎字、令牌交換等功能腥椒,本文將對(duì)其結(jié)合Oauth2入門使用進(jìn)行詳細(xì)介紹。

OAuth2 簡(jiǎn)介

OAuth 2.0是用于授權(quán)的行業(yè)標(biāo)準(zhǔn)協(xié)議候衍。OAuth 2.0為簡(jiǎn)化客戶端開發(fā)提供了特定的授權(quán)流寞酿,包括Web應(yīng)用、桌面應(yīng)用脱柱、移動(dòng)端應(yīng)用等。

OAuth2 相關(guān)名詞解釋

Resource owner(資源擁有者):擁有該資源的最終用戶拉馋,他有訪問資源的賬號(hào)密碼榨为;

Resource server(資源服務(wù)器):擁有受保護(hù)資源的服務(wù)器,如果請(qǐng)求包含正確的訪問令牌煌茴,可以訪問資源随闺;

Client(客戶端):訪問資源的客戶端,會(huì)使用訪問令牌去獲取資源服務(wù)器的資源蔓腐,可以是瀏覽器矩乐、移動(dòng)設(shè)備或者服務(wù)器;

Authorization server(認(rèn)證服務(wù)器):用于認(rèn)證用戶的服務(wù)器回论,如果客戶端認(rèn)證通過散罕,發(fā)放訪問資源服務(wù)器的令牌。

四種授權(quán)模式

Authorization Code(授權(quán)碼模式):正宗的OAuth2的授權(quán)模式傀蓉,客戶端先將用戶導(dǎo)向認(rèn)證服務(wù)器欧漱,登錄后獲取授權(quán)碼,然后進(jìn)行授權(quán)葬燎,最后根據(jù)授權(quán)碼獲取訪問令牌误甚;

Implicit(簡(jiǎn)化模式):和授權(quán)碼模式相比缚甩,取消了獲取授權(quán)碼的過程,直接獲取訪問令牌窑邦;

Resource Owner Password Credentials(密碼模式):客戶端直接向用戶獲取用戶名和密碼擅威,之后向認(rèn)證服務(wù)器獲取訪問令牌;

Client Credentials(客戶端模式):客戶端直接通過客戶端認(rèn)證(比如client_id和client_secret)從認(rèn)證服務(wù)器獲取訪問令牌冈钦。

兩種常用的授權(quán)模式

授權(quán)碼模式

(A)客戶端將用戶導(dǎo)向認(rèn)證服務(wù)器郊丛;

(B)用戶在認(rèn)證服務(wù)器進(jìn)行登錄并授權(quán);

(C)認(rèn)證服務(wù)器返回授權(quán)碼給客戶端派继;

(D)客戶端通過授權(quán)碼和跳轉(zhuǎn)地址向認(rèn)證服務(wù)器獲取訪問令牌宾袜;

(E)認(rèn)證服務(wù)器發(fā)放訪問令牌(有需要帶上刷新令牌)。

密碼模式

(A)客戶端從用戶獲取用戶名和密碼驾窟;

(B)客戶端通過用戶的用戶名和密碼訪問認(rèn)證服務(wù)器庆猫;

(C)認(rèn)證服務(wù)器返回訪問令牌(有需要帶上刷新令牌)。

Oauth2的使用

創(chuàng)建oauth2-server模塊

這里我們創(chuàng)建一個(gè)oauth2-server模塊作為認(rèn)證服務(wù)器來使用绅络。

在pom.xml中添加相關(guān)依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>Copy to clipboardErrorCopied

在application.yml中進(jìn)行配置:

server:

? port: 9401

spring:

? application:

? ? name: oauth2-serviceCopy to clipboardErrorCopied

添加UserService實(shí)現(xiàn)UserDetailsService接口月培,用于加載用戶信息:

/**

* Created by macro on 2019/9/30.

*/@ServicepublicclassUserServiceimplementsUserDetailsService{privateList<User>userList;@AutowiredprivatePasswordEncoderpasswordEncoder;@PostConstructpublicvoidinitData(){Stringpassword=passwordEncoder.encode("123456");userList=newArrayList<>();userList.add(newUser("macro",password,AuthorityUtils.commaSeparatedStringToAuthorityList("admin")));userList.add(newUser("andy",password,AuthorityUtils.commaSeparatedStringToAuthorityList("client")));userList.add(newUser("mark",password,AuthorityUtils.commaSeparatedStringToAuthorityList("client")));}@OverridepublicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{List<User>findUserList=userList.stream().filter(user->user.getUsername().equals(username)).collect(Collectors.toList());if(!CollectionUtils.isEmpty(findUserList)){returnfindUserList.get(0);}else{thrownewUsernameNotFoundException("用戶名或密碼錯(cuò)誤");}}}Copy to clipboardErrorCopied

添加認(rèn)證服務(wù)器配置,使用@EnableAuthorizationServer注解開啟:

/**

* 認(rèn)證服務(wù)器配置

* Created by macro on 2019/9/30.

*/@Configuration@EnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{@AutowiredprivatePasswordEncoderpasswordEncoder;@AutowiredprivateAuthenticationManagerauthenticationManager;@AutowiredprivateUserServiceuserService;/**

? ? * 使用密碼模式需要配置

? ? */@Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints){endpoints.authenticationManager(authenticationManager).userDetailsService(userService);}@Overridepublicvoidconfigure(ClientDetailsServiceConfigurerclients)throwsException{clients.inMemory().withClient("admin")//配置client_id.secret(passwordEncoder.encode("admin123456"))//配置client_secret.accessTokenValiditySeconds(3600)//配置訪問token的有效期.refreshTokenValiditySeconds(864000)//配置刷新token的有效期.redirectUris("http://www.baidu.com")//配置redirect_uri恩急,用于授權(quán)成功后跳轉(zhuǎn).scopes("all")//配置申請(qǐng)的權(quán)限范圍.authorizedGrantTypes("authorization_code","password");//配置grant_type杉畜,表示授權(quán)類型}}Copy to clipboardErrorCopied

添加資源服務(wù)器配置,使用@EnableResourceServer注解開啟:

/**

* 資源服務(wù)器配置

* Created by macro on 2019/9/30.

*/@Configuration@EnableResourceServerpublicclassResourceServerConfigextendsResourceServerConfigurerAdapter{@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().anyRequest().authenticated().and().requestMatchers().antMatchers("/user/**");//配置需要保護(hù)的資源路徑}}Copy to clipboardErrorCopied

添加SpringSecurity配置衷恭,允許認(rèn)證相關(guān)路徑的訪問及表單登錄:

/**

* SpringSecurity配置

* Created by macro on 2019/10/8.

*/@Configuration@EnableWebSecuritypublicclassSecurityConfigextendsWebSecurityConfigurerAdapter{@BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}@Bean@OverridepublicAuthenticationManagerauthenticationManagerBean()throwsException{returnsuper.authenticationManagerBean();}@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.csrf().disable().authorizeRequests().antMatchers("/oauth/**","/login/**","/logout/**").permitAll().anyRequest().authenticated().and().formLogin().permitAll();}}Copy to clipboardErrorCopied

添加需要登錄的接口用于測(cè)試:

/**

* Created by macro on 2019/9/30.

*/@RestController@RequestMapping("/user")publicclassUserController{@GetMapping("/getCurrentUser")publicObjectgetCurrentUser(Authenticationauthentication){returnauthentication.getPrincipal();}}Copy to clipboardErrorCopied

授權(quán)碼模式使用

啟動(dòng)oauth2-server服務(wù)此叠;

在瀏覽器訪問該地址進(jìn)行登錄授權(quán):http://localhost:9401/oauth/authorize?response_type=code&client_id=admin&redirect_uri=http://www.baidu.com&scope=all&state=normal

輸入賬號(hào)密碼進(jìn)行登錄操作:

登錄后進(jìn)行授權(quán)操作:

之后會(huì)瀏覽器會(huì)帶著授權(quán)碼跳轉(zhuǎn)到我們指定的路徑:

https://www.baidu.com/?code=eTsADY&state=normalCopy to clipboardErrorCopied

使用授權(quán)碼請(qǐng)求該地址獲取訪問令牌:http://localhost:9401/oauth/token

使用Basic認(rèn)證通過client_id和client_secret構(gòu)造一個(gè)Authorization頭信息;

在body中添加以下參數(shù)信息随珠,通過POST請(qǐng)求獲取訪問令牌灭袁;

在請(qǐng)求頭中添加訪問令牌,訪問需要登錄認(rèn)證的接口進(jìn)行測(cè)試窗看,發(fā)現(xiàn)已經(jīng)可以成功訪問:http://localhost:9401/user/getCurrentUser

密碼模式使用

使用密碼請(qǐng)求該地址獲取訪問令牌:http://localhost:9401/oauth/token

使用Basic認(rèn)證通過client_id和client_secret構(gòu)造一個(gè)Authorization頭信息茸歧;

在body中添加以下參數(shù)信息,通過POST請(qǐng)求獲取訪問令牌显沈;

使用到的模塊

springcloud-learning

└── oauth2-server -- oauth2認(rèn)證測(cè)試服務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末软瞎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拉讯,更是在濱河造成了極大的恐慌涤浇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魔慷,死亡現(xiàn)場(chǎng)離奇詭異芙代,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盖彭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門纹烹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來页滚,“玉大人,你說我怎么就攤上這事铺呵」郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵片挂,是天一觀的道長(zhǎng)幻林。 經(jīng)常有香客問我,道長(zhǎng)音念,這世上最難降的妖魔是什么沪饺? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮闷愤,結(jié)果婚禮上整葡,老公的妹妹穿的比我還像新娘。我一直安慰自己讥脐,他們只是感情好遭居,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旬渠,像睡著了一般俱萍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上告丢,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天枪蘑,我揣著相機(jī)與錄音,去河邊找鬼岖免。 笑死腥寇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的觅捆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼麻敌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼栅炒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起术羔,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赢赊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后级历,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體释移,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年寥殖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玩讳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩蜘。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熏纯,靈堂內(nèi)的尸體忽然破棺而出同诫,到底是詐尸還是另有隱情,我是刑警寧澤樟澜,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布误窖,位于F島的核電站,受9級(jí)特大地震影響秩贰,放射性物質(zhì)發(fā)生泄漏霹俺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一毒费、第九天 我趴在偏房一處隱蔽的房頂上張望丙唧。 院中可真熱鬧,春花似錦蝗罗、人聲如沸艇棕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沼琉。三九已至,卻和暖如春桩匪,著一層夾襖步出監(jiān)牢的瞬間打瘪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工傻昙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闺骚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓妆档,卻偏偏與公主長(zhǎng)得像僻爽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贾惦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355