最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security OAuth2認(rèn)證授權(quán)示例詳解

 更新時間:2019年09月05日 09:28:56   作者:peterwanghao  
這篇文章主要介紹了Spring Security OAuth2認(rèn)證授權(quán)示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文介紹了如何使用Spring Security OAuth2構(gòu)建一個授權(quán)服務(wù)器來驗證用戶身份以提供access_token,并使用這個access_token來從資源服務(wù)器請求數(shù)據(jù)。

1.概述

OAuth2是一種授權(quán)方法,用于通過HTTP協(xié)議提供對受保護(hù)資源的訪問。首先,OAuth2使第三方應(yīng)用程序能夠獲得對HTTP服務(wù)的有限訪問權(quán)限,然后通過資源所有者和HTTP服務(wù)之間的批準(zhǔn)交互來讓第三方應(yīng)用程序代表資源所有者獲取訪問權(quán)限。

1.1 角色

OAuth定義了四個角色

  • 資源所有者 - 應(yīng)用程序的用戶。
  • 客戶端 - 需要訪問資源服務(wù)器上的用戶數(shù)據(jù)的應(yīng)用程序。
  • 資源服務(wù)器 - 存儲用戶數(shù)據(jù)和http服務(wù),可以將用戶數(shù)據(jù)返回給經(jīng)過身份驗證的客戶端。
  • 授權(quán)服務(wù)器 - 負(fù)責(zé)驗證用戶的身份并提供授權(quán)令牌。資源服務(wù)器接受此令牌并驗證您的身份。

OAuth2的交互過程:

OAuth2機(jī)制

1.2 訪問令牌與刷新令牌

訪問令牌代表一個向客戶授權(quán)的字符串。令牌包含了由資源所有者授予的權(quán)限范圍和訪問持續(xù)時間,并由資源服務(wù)器和授權(quán)服務(wù)器強(qiáng)制執(zhí)行。

授權(quán)服務(wù)器向客戶端發(fā)出刷新令牌,用于在當(dāng)前訪問令牌失效或過期時獲取新的訪問令牌,或獲取具有相同或更窄范圍的其他訪問令牌,新的訪問令牌可能具有比資源所有者授權(quán)的更短的生命周期和更少的權(quán)限。根據(jù)授權(quán)服務(wù)器的判斷,發(fā)布刷新令牌是可選的。

訪問令牌的責(zé)任是在數(shù)據(jù)到期之前訪問它。
刷新令牌的責(zé)任是在現(xiàn)有訪問令牌過期時請求新的訪問令牌。

2. OAuth2 - 授權(quán)服務(wù)器

要使用spring Security OAuth2模塊創(chuàng)建授權(quán)服務(wù)器,我們需要使用注解@EnableAuthorizationServer并擴(kuò)展AuthorizationServerConfigurerAdapter類。

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
	@Autowired
	private BCryptPasswordEncoder passwordEncoder;

	@Override
	public void configure(AuthorizationServerSecurityConfigurer security)
			throws Exception {
		security.tokenKeyAccess("permitAll()")
				.checkTokenAccess("isAuthenticated()")
				.allowFormAuthenticationForClients();
	}

	@Override
	public void configure(ClientDetailsServiceConfigurer clients)
			throws Exception {
		clients.inMemory().withClient("clientapp")
				.secret(passwordEncoder.encode("654321"))
				.authorizedGrantTypes("password", "authorization_code",
						"refresh_token")
				.authorities("READ_ONLY_CLIENT").scopes("read_user_info")
				.resourceIds("oauth2-resource")
				.redirectUris("http://localhost:8081/login")
				.accessTokenValiditySeconds(5000)
				.refreshTokenValiditySeconds(50000);
	}
}

Spring Security OAuth2會公開了兩個端點,用于檢查令牌(/oauth/check_token和/oauth/token_key),這些端點默認(rèn)受保護(hù)denyAll()。tokenKeyAccess()和checkTokenAccess()方法會打開這些端點以供使用。

ClientDetailsServiceConfigurer用于定義客戶端詳細(xì)的服務(wù)信息,它可以在內(nèi)存中或在數(shù)據(jù)庫中定義。

在本例中我們使用了內(nèi)存實現(xiàn)。它具有以下重要屬性:

  • clientId - (必需)客戶端ID。
  • secret - (可信客戶端所需)客戶端密鑰(可選)。
  • scope - 客戶受限的范圍。如果范圍未定義或為空(默認(rèn)值),則客戶端不受范圍限制。
  • authorizedGrantTypes - 授權(quán)客戶端使用的授權(quán)類型。默認(rèn)值為空。
  • authorities - 授予客戶的權(quán)限(常規(guī)Spring Security權(quán)限)。
  • redirectUris - 將用戶代理重定向到客戶端的重定向端點。它必須是絕對URL。

3. OAuth2 - 資源服務(wù)器

要創(chuàng)建資源服務(wù)器組件,請使用@EnableResourceServer注解并擴(kuò)展ResourceServerConfigurerAdapter類。

@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
	@Override
	public void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
			.antMatchers("/").permitAll()
			.antMatchers("/api/**").authenticated();
	}
}

以上配置啟用/api下所有端點的保護(hù),但可以自由訪問其他端點。

資源服務(wù)器還提供了一種對用戶自己進(jìn)行身份驗證的機(jī)制。在大多數(shù)情況下,它通常是基于表單的登錄。

@Configuration
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.antMatcher("/**")
				.requestMatchers()
				.antMatchers("/oauth/authorize**", "/login**", "/error**")
			.and()
				.authorizeRequests().anyRequest().authenticated()
			.and()
				.formLogin().permitAll();
	}

	@Override
	protected void configure(AuthenticationManagerBuilder auth)
			throws Exception {
		auth.inMemoryAuthentication().withUser("peterwanghao")
				.password(passwordEncoder().encode("123456")).roles("USER");
	}

	@Bean
	public BCryptPasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

4. OAuth2保護(hù)的REST資源

本例中只創(chuàng)建了一個RESTful API,它返回登錄用戶的姓名和電子郵件。

@Controller
public class RestResource {
	@RequestMapping("/api/users/me")
	public ResponseEntity<UserInfo> profile() {
		User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		String email = user.getUsername() + "@126.com";

		UserInfo profile = new UserInfo();
		profile.setName(user.getUsername());
		profile.setEmail(email);

		return ResponseEntity.ok(profile);
	}
}
public class UserInfo {
	private String name;
	private String email;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", email=" + email + "]";
	}
}

5.演示

我們有一個API http://localhost:8080/api/users/me ,我們想通過第三方應(yīng)用程序來訪問API需要OAuth2令牌。

5.1 從用戶獲取授權(quán)許可代碼

如上面的序列圖所示,第一步是從URL獲取資源所有者的授權(quán):

http://localhost:8080/oauth/authorize?client_id=clientapp&response_type=code&scope=read_user_info

通過瀏覽器訪問上面的URL地址,它將展現(xiàn)一個登錄頁面。提供用戶名和密碼。對于此示例,請使用“peterwanghao”和“123456”。

登錄

登錄后,您將被重定向到授予訪問頁面,您可以在其中選擇授予對第三方應(yīng)用程序的訪問權(quán)限。

授權(quán)

它會重定向到URL,如:http://localhost:8081/login?code=TUXuk9 。這里'TUXuk9'是第三方應(yīng)用程序的授權(quán)代碼。

5.2 從授權(quán)服務(wù)器獲取訪問令牌

現(xiàn)在,應(yīng)用程序?qū)⑹褂檬跈?quán)碼來獲取訪問令牌。在這里,我們需要提出以下請求。使用此處第一步中獲得的代碼。

curl -X POST --user clientapp:654321 http://localhost:8080/oauth/token -H "content-type: application/x-www-form-urlencoded" -d "code=TUXuk9&grant_type=authorization_code&redirect_uri=http://localhost:8081/login&scope=read_user_info"

訪問令牌響應(yīng)

{ 
  "access_token": "168aad01-05dc-4446-9fba-fd7dbe8adb9e", 
  "token_type": "bearer", 
  "refresh_token": "34065175-1e92-4bb0-918c-a5a6ece1dc5f", 
  "expires_in": 4999, 
  "scope": "read_user_info" 
}

5.3 從資源服務(wù)器訪問用戶數(shù)據(jù)

一旦我們有了訪問令牌,我們就可以轉(zhuǎn)到資源服務(wù)器來獲取受保護(hù)的用戶數(shù)據(jù)。

curl -X GET http://localhost:8080/api/users/me -H "authorization: Bearer 168aad01-05dc-4446-9fba-fd7dbe8adb9e"

獲得資源響應(yīng)

{
  "name":"peterwanghao",
  "email":"peterwanghao@126.com"
}

6.總結(jié)

本文講解了OAuth2授權(quán)框架的實現(xiàn)機(jī)制,通過一個例子說明了第三方應(yīng)用程序如何通過授權(quán)服務(wù)器的授權(quán)去資源服務(wù)器上獲取受保護(hù)的數(shù)據(jù)。本例的完整代碼在GitHub 上。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 完美解決java.lang.OutOfMemoryError處理錯誤的問題

    完美解決java.lang.OutOfMemoryError處理錯誤的問題

    下面小編就為大家?guī)硪黄昝澜鉀Qjava.lang.OutOfMemoryError處理錯誤的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • spring cloud 之 客戶端負(fù)載均衡Ribbon深入理解

    spring cloud 之 客戶端負(fù)載均衡Ribbon深入理解

    下面小編就為大家?guī)硪黄猻pring cloud 之 客戶端負(fù)載均衡Ribbon深入理解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • java泛型類的定義與使用詳解

    java泛型類的定義與使用詳解

    這篇文章主要為大家詳細(xì)介紹了java泛型類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java之經(jīng)典排序算法

    Java之經(jīng)典排序算法

    這篇文章主要介紹了Java的一些經(jīng)典排序算法,對Java算法感興趣的小伙伴可以詳細(xì)參考閱讀本文,對同學(xué)們有一定的參考價值
    2023-03-03
  • 從原理到實戰(zhàn)深入理解Java 斷言assert

    從原理到實戰(zhàn)深入理解Java 斷言assert

    本文深入解析Java斷言機(jī)制,涵蓋語法、工作原理、啟用方式及與異常的區(qū)別,推薦用于開發(fā)階段的條件檢查與狀態(tài)驗證,并強(qiáng)調(diào)生產(chǎn)環(huán)境應(yīng)使用參數(shù)驗證工具類替代,附常見問題解答及實踐案例,感興趣的朋友一起看看吧
    2025-06-06
  • Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法

    Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法

    這篇文章主要介紹了Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法,具體實現(xiàn)代碼,大家參考下本文
    2017-12-12
  • Java將文件壓縮成zip并下載

    Java將文件壓縮成zip并下載

    這篇文章主要為大家詳細(xì)介紹了Java如何將文件壓縮成zip和下載,并處理base64和url,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2025-04-04
  • SpringBoot+Mybatis使用Mapper接口注冊的幾種方式

    SpringBoot+Mybatis使用Mapper接口注冊的幾種方式

    本篇博文中主要介紹是Mapper接口與對應(yīng)的xml文件如何關(guān)聯(lián)的幾種姿勢,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • java求兩個數(shù)中的大數(shù)(實例講解)

    java求兩個數(shù)中的大數(shù)(實例講解)

    下面小編就為大家?guī)硪黄猨ava求兩個數(shù)中的大數(shù)(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • springboot對數(shù)據(jù)庫密碼加密的實現(xiàn)

    springboot對數(shù)據(jù)庫密碼加密的實現(xiàn)

    這篇文章主要介紹了springboot對數(shù)據(jù)庫密碼加密的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論

金华市| 富源县| 沐川县| 兴安盟| 共和县| 黎城县| 新丰县| 宜州市| 芷江| 论坛| 江永县| 浦县| 高雄市| 腾冲县| 贵港市| 伊春市| 呼和浩特市| 砚山县| 章丘市| 耿马| 潮安县| 平塘县| 五常市| 龙里县| 金门县| 温泉县| 贵德县| 扎鲁特旗| 黔西县| 庆云县| 定安县| 镇沅| 凌海市| 绥宁县| 淮安市| 三门峡市| 霍城县| 大港区| 泗阳县| 开阳县| 新疆|