Spring Security 自定義資源服務(wù)器實(shí)踐過(guò)程
前言
在前面我們使用最小化配置的方式搭建了自己的授權(quán)服務(wù)器,現(xiàn)在我們依舊用最小化的方式配置自己的資源服務(wù)器。
資源服務(wù)器負(fù)責(zé)scope的鑒權(quán)、authorities的鑒權(quán)、基于用戶(hù)角色的鑒權(quán)等。
最小化配置
安裝資源服務(wù)器
1、 新建一個(gè)Spring Boot項(xiàng)目,命名為spring-security-resource-server
2、引入pom.xml依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>其中與授權(quán)服務(wù)器依賴(lài)不同的是,資源服務(wù)器有spring boot版本,版本號(hào)會(huì)有spring boot進(jìn)行管理,不需要顯示聲明。
配置資源服務(wù)器
1、配置application.yml 文件
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:9000
該配置用于指定授權(quán)服務(wù)器地址,資源服務(wù)器將從該地址獲取JWT令牌,并根據(jù)JWT中的屬性進(jìn)一步自我配置,發(fā)現(xiàn)授權(quán)服務(wù)器的公鑰、驗(yàn)證JWT令牌。
2、創(chuàng)建配置類(lèi)
@EnableWebSecurity(debug = true)
public class ResoruceServerConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.mvcMatchers("/userinfo/**").hasAuthority("SCOPE_userinfo")
.and()
.oauth2ResourceServer()
.jwt();
return http.build();
}
}.mvcMatchers("/userinfo/**").hasAuthority("SCOPE_userinfo")匹配/userinfo/**地址,允許訪(fǎng)問(wèn)范圍是SCOPE_userinfooauth2ResourceServer()定義為資源服務(wù)器jwt()使用JWT令牌
3、 創(chuàng)建一個(gè)資源接口/userinfo/用來(lái)獲取資源所有者基本信息
@Data
public class UserInfoRes {
private String username;
}創(chuàng)建Rest接口
@RestController
public class UserInfoController {
@GetMapping("/userinfo")
public UserInfoRes getUserInfo() {
UserInfoRes userInfoRes = new UserInfoRes();
userInfoRes.setUsername("阿提說(shuō)說(shuō)");
return userInfoRes;
}
}配置客戶(hù)端
目前我們客戶(hù)端的配置是這樣的:
spring:
security:
oauth2:
client:
registration:
gitee:
client-id: gitee_clientId
client-secret: gitee_secret
authorization-grant-type: authorization_code
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-name: Gitee
github:
client-id: github_clientId
client-secret: github_secret
# 自定義
customize:
client-id: testClientId
client-secret: testClientSecret
authorization-grant-type: authorization_code
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-name: Customize
scope:
- userinfo
provider:
gitee:
authorization-uri: https://gitee.com/oauth/authorize
token-uri: https://gitee.com/oauth/token
user-info-uri: https://gitee.com/api/v5/user
user-name-attribute: name
# 自定義
customize:
authorization-uri: http://localhost:9000/oauth2/authorize
token-uri: http://localhost:9000/oauth2/token
user-info-uri: http://localhost:9000/userinfo
user-name-attribute: username
這里我們只需要修改customize部分的user-info-uri和 user-name-attribute
調(diào)整后配置如下,其他部分跟原來(lái)是一樣的。
customize:
authorization-uri: http://localhost:9000/oauth2/authorize
token-uri: http://localhost:9000/oauth2/token
user-info-uri: http://localhost:8090/userinfo
user-name-attribute: username? user-name-attribute的名字,必須在user-info-uri返回的屬性名中存在
整流程體驗(yàn)
在如上三部分配置完成后,就可以體驗(yàn)了,啟動(dòng)spring-security-resource-server、spring-security-authorization-server、spring-security-oauth2-client
瀏覽器訪(fǎng)問(wèn)地址:http://127.0.0.1:8080/hello,在授權(quán)完成后,即跳轉(zhuǎn)回并顯示結(jié)果。

ResourceServer下能看到帶著token的/userinfo請(qǐng)求日志。
************************************************************ Request received for GET '/userinfo': org.apache.catalina.connector.RequestFacade@3418bfc9 servletPath:/userinfo pathInfo:null headers: accept: application/json authorization: Bearer eyJraWQiOiI5YjZjZWMzNi05ZDYyLTRkMWMtOWRiNi0wMWM1ODQzMDc1N2UiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiYXVkIjoidGVzdENsaWVudElkIiwibmJmIjoxNjYwOTU1ODQyLCJzY29wZSI6WyJ1c2VyaW5mbyJdLCJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6OTAwMCIsImV4cCI6MTY2MDk1NjE0MiwiaWF0IjoxNjYwOTU1ODQyfQ.gVWwwfzB-xNuWWUBpgGokIOy5xwV9Wkd05k3rqpk1h92b-TWENB4ZArEL--zpngSyE8iuml0vG3veCv647FDx_EY56ClM-UxH-3Wq0D2f3b6WTgFO5RpCCwRLCHahBlV5g9plr7hWYY5uX2cQ4MsC4-ltZSR6wga5LSLDB-bIK46ZmJ3DOaQFwTTCpWB4OgOuq1j59i9XkgDUc_I8WUsHB4eEDEbBJeOmdimDn5O1Ux6nDhPgLMLcpnrt3lHLmXDTk8Q7hX7YBynO2VBm6wkTeYP4a2rfinfhW-LtF1o3hm8QAY0hn1QKSEeWU5K5qiIOVeSJ5FqrYJ_VQPadT1qAQ user-agent: Java/11 host: localhost:8090 connection: keep-alive Security filter chain: [ DisableEncodeUrlFilter WebAsyncManagerIntegrationFilter SecurityContextPersistenceFilter HeaderWriterFilter CsrfFilter LogoutFilter BearerTokenAuthenticationFilter RequestCacheAwareFilter SecurityContextHolderAwareRequestFilter AnonymousAuthenticationFilter SessionManagementFilter ExceptionTranslationFilter FilterSecurityInterceptor ] ************************************************************
總結(jié)
到此,我們通過(guò)自己搭建的授權(quán)服務(wù)器和資源服務(wù)器,完整體驗(yàn)了OAuth2流程,再來(lái)體會(huì)下第一篇文章中說(shuō)明的交互流程。

在整個(gè)流程中,我們使用的是最嚴(yán)密的授權(quán)碼模式,它將用戶(hù)引導(dǎo)到授權(quán)服務(wù)器進(jìn)行身份驗(yàn)證,授權(quán)服務(wù)器將發(fā)放的訪(fǎng)問(wèn)令牌傳遞給客戶(hù)端,目前主流都是使用該模式,因此特別重要,要好好體會(huì)。

源代碼地址:https://github.com/jujunchen/21Study
到此這篇關(guān)于Spring Security 自定義資源服務(wù)器實(shí)踐過(guò)程的文章就介紹到這了,更多相關(guān)Spring Security 自定義資源服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springSecurity實(shí)現(xiàn)簡(jiǎn)單的登錄功能
- SpringSecurity注銷(xiāo)設(shè)置的方法
- SpringSecurity自定義登錄成功處理
- SpringSecurity自定義登錄界面
- SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解
- Spring?Security?自定義授權(quán)服務(wù)器實(shí)踐記錄
- SpringSecurity添加圖形驗(yàn)證碼認(rèn)證實(shí)現(xiàn)
- SpringBoot淺析安全管理之Spring Security配置
- Spring Security十分鐘入門(mén)教程
相關(guān)文章
利用Java搭建個(gè)簡(jiǎn)單的Netty通信實(shí)例教程
這篇文章主要給大家介紹了關(guān)于如何利用Java搭建個(gè)簡(jiǎn)單的Netty通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠(chǎng)模式(Abstract?Factory)
當(dāng)系統(tǒng)所提供的工廠(chǎng)所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中屬于不同類(lèi)型的具體產(chǎn)品時(shí)需要使用抽象工廠(chǎng)模式,抽象工廠(chǎng)模式是所有形式的工廠(chǎng)模式中最為抽象和最具一般性的一種形態(tài)2022-09-09
mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問(wèn)題
這篇文章主要介紹了mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
java實(shí)現(xiàn)簡(jiǎn)單點(diǎn)贊功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單點(diǎn)贊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Java中對(duì)null進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的方法
小編對(duì)null進(jìn)行強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋錯(cuò),非常的好奇,下面小編通過(guò)實(shí)例代碼給大家介紹Java中對(duì)null進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的方法,感興趣的朋友參考下吧2018-09-09
Java的idea連接mongodb數(shù)據(jù)庫(kù)的詳細(xì)教程
這篇文章主要介紹了Java的idea連接mongodb數(shù)據(jù)庫(kù)的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Java中的強(qiáng)制類(lèi)型轉(zhuǎn)換 大數(shù)轉(zhuǎn)小數(shù)
這里主要討論一下大數(shù)轉(zhuǎn)小數(shù),比如int類(lèi)型轉(zhuǎn)short類(lèi)型。小數(shù)轉(zhuǎn)大數(shù),如short 轉(zhuǎn) int不做討論,需要的朋友可以參考下2020-02-02
JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能實(shí)例詳解
這篇文章主要介紹了JavaWeb中使用JavaMail實(shí)現(xiàn)發(fā)送郵件功能的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-05-05
Java JDK11基于嵌套的訪(fǎng)問(wèn)控制的實(shí)現(xiàn)
這篇文章主要介紹了Java JDK11基于嵌套的訪(fǎng)問(wèn)控制的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

