欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Security Oauth2.0認證授權(quán)教程

 更新時間:2025年07月28日 09:51:27   作者:時下握今  
Spring Security實現(xiàn)用戶認證、會話管理及授權(quán),支持Token等多方式,OAuth2.0用于分布式系統(tǒng)統(tǒng)一認證,網(wǎng)關(guān)解析令牌并轉(zhuǎn)發(fā)請求

基本概念

認證: 用戶認證就是判斷一個用戶的身份是否合法的過程 ,用戶去訪問系統(tǒng)資源時系統(tǒng)要求驗證用戶的身份信息,身份合法方可繼續(xù)訪問,不合法則拒絕訪問。常見的用戶身份認證方式有:用戶名密碼登錄,二維碼登錄,手機短信登錄,指紋認證等方式。

會話:用戶認證通過后,為了避免用戶的每次操作都進行認證可將用戶的信息保證在會話中。會話就是系統(tǒng)為了保持當前用戶的登錄狀態(tài)所提供的機制,常見的有基于session方式、基于token方式等。

授權(quán):授權(quán)是用戶認證通過后根據(jù)用戶的權(quán)限來控制用戶訪問資源的過程,擁有資源的訪問權(quán)限則正常訪問,沒有權(quán)限則拒絕訪問。授權(quán)可簡單理解為Who對What(which)進行How操作,

Who,即主體( Subject), 主體一般是指用戶,也可以是程序,需要訪問系統(tǒng)中的資源。

What,即資源( Resource), 如系統(tǒng)菜單、頁面、按鈕、代碼方法、系統(tǒng)商品信息、系統(tǒng)訂單信息等。系統(tǒng)菜單、頁面、按鈕、代碼方法都屬于 系統(tǒng)功能資源,對于web系統(tǒng)每個功能資源通常對應(yīng)一個URL ;系統(tǒng)商品信息系統(tǒng)訂單信息都屬于 實體資源(數(shù)據(jù)資源), 實體資源由資源類型和資源實例組成,比如商品信息為資源類型,商品編號為001的商品為資源實例。

How ,權(quán)限/許可( Permission), 規(guī)定了用戶對資源的操作許可,權(quán)限離開資源沒有意義,如用戶查詢權(quán)限、用戶添加權(quán)限、某個代碼方法的調(diào)用權(quán)限、編號為001的用戶的修改權(quán)限等,通過權(quán)限可知用戶對哪些資源都有哪些操作許可。

  • 授權(quán)的數(shù)據(jù)模型

  • 資源和權(quán)限可以合并一起

  • RBAC

基于角色的訪問控制 if (主體.hasRole()){}

基于資源的訪問控制 if(主體.hasPermission()){}

Spring Boot Security

對所有進入系統(tǒng)的請求進行攔截,校驗每個請求是否能夠訪問它所期望的資源,通過Filter實現(xiàn)

2.1 結(jié)構(gòu)原理

初始化Spring Security時,初始化一個類型為org.springframework.security.web.FilterChainProxy的過濾器,

外部的請求會經(jīng)過此類。FilterChainProxy是一個代理,真正起作用的是FilterChainProxy中SecurityFilterChain所包含的各個Filter,同時這些Filter作為Bean被Spring管理,它們是Spring Security核心,并不直接處理用戶的認證,也不直接處理用戶的授權(quán),而是把它們交給認證管理器(AuthenticationManager)決策管理器(AccessDecisionManager)進行處理

spring Security功能的實現(xiàn)主要是由一系列過濾器鏈相互配合完成。

2.2 認證過程

1. 用戶提交用戶名、密碼被SecurityFilterChain中的 UsernamePasswordAuthenticationFilter 過濾器獲取到,封裝為請求Authentication,通常情況下是UsernamePasswordAuthenticationToken這個實現(xiàn)類。

2. 然后過濾器將Authentication提交至認證管理器(AuthenticationManager)進行認證

3. 認證成功后, AuthenticationManager 身份管理器返回一個被填充滿了信息的(包括上面提到的權(quán)限信息,身份信息,細節(jié)信息,但密碼通常會被移除) Authentication 實例。

4. SecurityContextHolder 安全上下文容器將第3步填充了信息的 Authentication ,通過

SecurityContextHolder.getContext().setAuthentication(…)方法,設(shè)置到其中。

AuthenticationManager接口(認證管理器)是認證相關(guān)的核心接口,也是發(fā)起認證的出發(fā)點,它的實現(xiàn)類為ProviderManager。

而Spring Security支持多種認證方式,因此ProviderManager維護著一個List<AuthenticationProvider> 列表,存放多種認證方式,最終實際的認證工作是由AuthenticationProvider完成。不同的認證方式使用不同的AuthenticationProvider。如使用用戶名密碼登錄時,使用DaoAuthenticationProvide

DaoAuthenticationProvider,它的內(nèi)部又維護著一個UserDetailsService負責(zé)UserDetails的獲取。最終AuthenticationProvider將UserDetails填充至Authentication。

2.3 密碼處理

Spring Security提供了很多內(nèi)置的PasswordEncoder,能夠開箱即用,使用某種PasswordEncoder只需要進行如

  • 下聲明即可

常見的密碼編碼器有:

NoOpPasswordEncoder、BCryptPasswordEncoder、Pbkdf2PasswordEncode、SCryptPasswordEncoder

2.4 授權(quán)過程

已認證用戶訪問受保護的web資源將被SecurityFilterChain中的 FilterSecurityInterceptor 的子類攔截。

  • FilterSecurityInterceptor會從 SecurityMetadataSource 的子類DefaultFilterInvocationSecurityMetadataSource 獲取要訪問當前資源所需要的權(quán)限Collection<ConfigAttribute>
  • SecurityMetadataSource其實就是讀取“安全攔截機制”
  • FilterSecurityInterceptor會調(diào)用 AccessDecisionManager 進行授權(quán)決策,若決策通過,則允許訪問資源,否則將禁止訪問。

此處會從安全上下文中獲取用戶:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

再進行比對和判斷。

  • decide接口就是用來鑒定當前用戶是否有訪問對應(yīng)受保護資源的權(quán)限。
  • authentication:要訪問資源的訪問者的身份
  • object:要訪問的受保護資源,web請求對應(yīng)FilterInvocation
  • confifigAttributes:是受保護資源的訪問策略,通過SecurityMetadataSource獲取。

Spring Security內(nèi)置了三個基于投票的AccessDecisionManager實現(xiàn)類

  • AffirmativeBased 只要有一個贊成票,則表示同意用戶訪問
  • ConsensusBased:贊成票多余反對票,則表示同意用戶訪問
  • UnanimousBased:只要有一個反對票,則表示反對用戶訪問

spring security為防止CSRF(Cross-site request forgery跨站請求偽造)的發(fā)生,限制了除了get以外的大多數(shù)方法,

解決方法1:

屏蔽CSRF控制,即spring security不再限制CSRF。

httpSecurity.csrf().disable()

解決方法2:

表單添加隱藏域:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

2.5 實際應(yīng)用

用戶認證通過后,為了避免用戶的每次操作都進行認證可將用戶的信息保存在會話中。spring security提供會話管理,認證通過后將身份信息放入SecurityContextHolder上下文,SecurityContext與當前線程進行綁定,方便獲取用戶身份。

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

2.5.1 會話控制

  • Spring Security會為每個登錄成功的用戶會新建一個Session
httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
  • session超時、session失效后,通過Spring Security 設(shè)置跳轉(zhuǎn)的路徑。
httpSecurity.sessionManagement()
.expiredUrl("/login‐view?error=EXPIRED_SESSION")
.invalidSessionUrl("/login‐view?error=INVALID_SESSION");
  • session退出
httpSecurity.logout()

.logoutUrl("/logout")
.logoutSuccessUrl("/login‐view?logout")
.logoutSuccessHandler(logoutSuccessHandler)
.addLogoutHandler(logoutHandler)
.invalidateHttpSession(true)

定制的 LogoutSuccessHandler ,實現(xiàn)用戶退出成功時的處理。如果指定了這個選項那么logoutSuccessUrl() 的設(shè)置被忽略;

添加一個 LogoutHandler ,用于實現(xiàn)用戶退出時的清理工作.默認 SecurityContextLogoutHandler 會被添加為最后一個 LogoutHandler;

指定是否在退出時讓 HttpSession 無效。 默認設(shè)置為 true。

2.5.2 web授權(quán)

使用 http.authorizeRequests() 對web資源進行授權(quán)保護

httpSecurity
.authorizeRequests()
.antMatchers("/r/r1").hasAuthority("p1") (
.antMatchers("/r/r2").hasAuthority("p2")
.antMatchers("/r/r3").access("hasAuthority('p1') and hasAuthority('p2')")
.antMatchers("/r/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()

保護URL常用的方法有:

  • authenticated() 保護URL,需要用戶登錄
  • permitAll() 指定URL無需保護,一般應(yīng)用與靜態(tài)資源文件
  • hasRole(String role) 限制單個角色訪問,角色將被增加 “ROLE_” .所以”ADMIN” 將和 “ROLE_ADMIN”進行比較.
  • hasAuthority(String authority) 限制單個權(quán)限訪問
  • hasAnyRole(String… roles)允許多個角色訪問.
  • hasAnyAuthority(String… authorities) 允許多個權(quán)限訪問.
  • access(String attribute) 該方法使用 SpEL表達式, 所以可以創(chuàng)建復(fù)雜的限制.
  • hasIpAddress(String ipaddressExpression) 限制IP地址或子網(wǎng)

2.5.3.方法授權(quán)

以在任何 @Configuration 實例上使用 @EnableGlobalMethodSecurity 注釋來啟用基于注解的安全性。

@PreAuthorize,@PostAuthorize, @Secured三類注解作用域服務(wù)層方法上,限制訪問的訪問

例如:

匿名訪問

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
@PreAuthorize("isAnonymous()")

方法可匿名訪問,底層使用WebExpressionVoter投票器

  • @PreAuthorize
@PreAuthorize("hasAuthority('p_transfer') and hasAuthority('p_read_account')")

同時擁有p_transfer和p_read_account權(quán)限才能訪問,底層使用WebExpressionVoter投票器

另外,還有注解@PostAuthorize

分布式系統(tǒng)認證方案

軟件的架構(gòu)由單體結(jié)構(gòu)演變?yōu)榉植际郊軜?gòu),具有分布式架構(gòu)的系統(tǒng)叫分布式系統(tǒng),分布式系統(tǒng)的運行通常依賴網(wǎng)絡(luò),它將單體結(jié)構(gòu)的系統(tǒng)分為若干服務(wù),服務(wù)之間通過網(wǎng)絡(luò)交互來完成用戶的業(yè)務(wù)處理,當前流行的微服務(wù)架構(gòu)就是分布式系統(tǒng)架構(gòu)。

3.1 分布式認證需求

分布式系統(tǒng)的每個服務(wù)都會有認證、授權(quán)的需求,考慮分布式系統(tǒng)共享性的特點,需要由獨立的認證服務(wù)處理系統(tǒng)認證授權(quán)的請求;考慮分布式系統(tǒng)開放性的特點,不僅對系統(tǒng)內(nèi)部服務(wù)提供認證,對第三方系統(tǒng)也要提供認證。分布式認證的需求總結(jié)如下:

統(tǒng)一認證授權(quán)

提供獨立的認證服務(wù),統(tǒng)一處理認證授權(quán)。無論是不同類型的用戶,還是不同種類的客戶端(web端,H5、APP),均采用一致的認證、權(quán)限、會話機制,實現(xiàn)統(tǒng)一認證授權(quán)。要實現(xiàn)統(tǒng)一則認證方式必須可擴展,支持各種認證需求,比如:用戶名密碼認證、短信驗證碼、二維碼、人臉識別等認證方式,并可以非常靈活的切換。

應(yīng)用接入認證

應(yīng)提供擴展和開放能力,提供安全的系統(tǒng)對接機制,并可開放部分API給接入第三方使用,一方應(yīng)用(內(nèi)部系統(tǒng)服務(wù))和三方應(yīng)用(第三方應(yīng)用)均采用統(tǒng)一機制接入。

3.2 選型分析

3.2.1 基于Session認證

每個應(yīng)用服務(wù)都需要在session中存儲用戶身份信息,通常的做法有下面幾種:

  • Session復(fù)制:多臺應(yīng)用服務(wù)器之間同步session,使session保持一致,對外透明。
  • Session黏貼:當用戶訪問集群中某臺服務(wù)器后,強制指定后續(xù)所有請求均落到此機器上。
  • Session集中存儲:將Session存入分布式緩存中,所有服務(wù)器應(yīng)用實例統(tǒng)一從分布式緩存中存取Session。

基于session認證的認證方式,可以更好的在服務(wù)端對會話進行控制,且安全性較高。但是,session機制方式基于cookie,在復(fù)雜多樣的移動客戶端上不能有效的使用,并且無法跨域,另外隨著系統(tǒng)的擴展需提高session的復(fù)制、黏貼及存儲的容錯性。

3.2.2 基于Token認證

基于token的認證方式,服務(wù)端不用存儲認證數(shù)據(jù),易維護擴展性強, 客戶端可以把token 存在任意地方,并且可以實現(xiàn)web和app統(tǒng)一認證機制。其缺點也很明顯,token由于自包含信息,因此一般數(shù)據(jù)量較大,而且每次請求都需要傳遞,因此比較占帶寬。另外,token的簽名驗簽操作也會給cpu帶來額外的處理負擔。

3.2.3 技術(shù)方案

根據(jù) 選型分析,采用token認證,它的優(yōu)點是:

  • 適合統(tǒng)一認證的機制,客戶端、一方應(yīng)用、三方應(yīng)用都遵循一致的認證機制。
  • token認證方式對第三方應(yīng)用接入更適合,因為它更開放,可使用當前有流行的開放協(xié)議Oauth2.0、JWT等。
  • 一般情況服務(wù)端無需存儲會話信息,減輕了服務(wù)端的壓力。

3.3 Oauth2.0

OAuth(開放授權(quán))是一個開放標準,允許用戶授權(quán)第三方應(yīng)用訪問他們存儲在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方應(yīng)用或分享他們數(shù)據(jù)的所有內(nèi)容。例如,第三方登錄,用戶 授權(quán) 電商網(wǎng)站 訪問 用戶存儲在微信平臺的用戶信息

OAauth2.0包括以下角色:

客戶端

本身不存儲資源,需要通過資源擁有者的授權(quán)去請求資源服務(wù)器的資源,比如:Android客戶端、Web客戶端(瀏覽器端)、微信客戶端等。

資源擁有者

通常為用戶,也可以是應(yīng)用程序,即該資源的擁有者。

資源服務(wù)器

存儲資源的服務(wù)器,例如微信平臺用戶信息資源。

服務(wù)提供商會給準入的接入方一個身份,用于接入時的憑據(jù):

  • client_id:客戶端標識
  • client_secret:客戶端秘鑰

授權(quán)服務(wù)器(也稱認證服務(wù)器)

用于服務(wù)提供商對資源擁有的身份進行認證、對訪問資源進行授權(quán),認證成功后會給客戶端發(fā)放令牌,作為客戶端訪問資源服務(wù)器的憑據(jù)。例如:微信認證服務(wù)器。

授權(quán)服務(wù)器對OAuth2.0中的兩個角色進行認證授權(quán),分別是資源擁有者、客戶端

Spring Cloud Security OAuth2

Spring-Security-OAuth2是對OAuth2的一種實現(xiàn),并且跟Spring Security相輔相成,與SpringCloud體系的集成也非常便利。其服務(wù)實現(xiàn)包括兩個服務(wù):

認證授權(quán)服務(wù) (Authorization Server)

應(yīng)包含對接入端以及登入用戶的合法性進行驗證并頒發(fā)token等功能,對令牌的請求端點由 Spring MVC 控制器進行實現(xiàn),下面是配置一個認證服務(wù)必須要實現(xiàn)的endpoints:

  • AuthorizationEndpoint 服務(wù)于認證請求。默認 URL:/oauth/authorize 。
  • TokenEndpoint 服務(wù)于訪問令牌的請求。默認 URL:/oauth/token 。

資源服務(wù) (Resource Server),應(yīng)包含對資源的保護功能,對非法請求進行攔截,對請求中token進行解析鑒權(quán)等,下面的過濾器用于實現(xiàn) OAuth 2.0 資源服務(wù):

OAuth2AuthenticationProcessingFilter用來對請求給出的身份令牌解析鑒權(quán)。

4.1 授權(quán)服務(wù)器配置

可以使用

@Configuration
@EnableAuthorizationServer

注解并繼承AuthorizationServerConfifigurerAdapter來配置OAuth2.0 授權(quán)服務(wù)器。

  • AuthorizationServerConfifigurerAdapter要求配置
  • ClientDetailsServiceConfifigurer:用來配置客戶端詳情服務(wù)(ClientDetailsService),客戶端詳情信息在這里進行初始化
  • AuthorizationServerEndpointsConfifigurer:用來配置令牌(token)的訪問端點和令牌服務(wù)(tokenservices)。
  • AuthorizationServerSecurityConfifigurer:用來配置令牌訪問端點的安全約束

4.1.1 客戶端詳情

ClientDetailsServiceConfifigurer能夠使用內(nèi)存或者JDBC來實現(xiàn)客戶端詳情,ClientDetailsService負責(zé)查找ClientDetails,而ClientDetails有幾個重要的屬性

客戶端詳情(Client Details)能夠在應(yīng)用程序運行的時候進行更新,可以通過訪問底層的存儲服務(wù)(例如將客戶端詳情存儲在一個關(guān)系數(shù)據(jù)庫的表中,就可以使用 JdbcClientDetailsService)或者通過實現(xiàn)

ClientRegistrationService接口(同時你也可以實現(xiàn) ClientDetailsService 接口)來管理。

此次客戶端詳情讀取數(shù)據(jù)庫的配置:

4.1.2令牌管理服務(wù)

AuthorizationServerTokenServices 接口定義了一些操作可以對令牌進行一些必要的管理,這個接口的實現(xiàn),則需要繼承 DefaultTokenServices,里面包含了一些有用實現(xiàn),你可以使用它來修改令牌的格式和令牌的存儲,其持久化令牌委托一個 TokenStore 接口來實現(xiàn),TokenStore 這個接口有一個默認的實現(xiàn),它就是 InMemoryTokenStore。

  • InMemoryTokenStore

這個版本的實現(xiàn)是被默認采用的,它可以完美的工作在單服務(wù)器上(即訪問并發(fā)量壓力不大的情況下,并且它在失敗的時候不會進行備份),大多數(shù)的項目都可以使用這個版本的實現(xiàn)來進行嘗試,可以在開發(fā)的時候使用它來進行管理,因為不會被保存到磁盤中,更易于調(diào)試。

  • JdbcTokenStore

這是一個基于JDBC的實現(xiàn)版本,令牌會被保存進關(guān)系型數(shù)據(jù)庫。

使用這個版本的實現(xiàn)時,你可以在不同的服務(wù)器之間共享令牌信息,使用這個版本的時候需要把"spring-jdbc"這個依賴加入到classpath。

  • JwtTokenStore:

這個版本的全稱是 JSON Web Token(JWT),它可以把令牌相關(guān)的數(shù)據(jù)進行編碼(因此對于后端服務(wù)來說,它不需要進行存儲,這將是一個重大優(yōu)勢),但是它有一個缺點,那就是撤銷一個已經(jīng)授權(quán)令牌將會非常困難,所以它通常用來處理一個生命周期較短的令牌以及撤銷刷新令牌(refresh_token)。

另外一個缺點就是這個令牌占用的空間會比較大,如果你加入了比較多用戶憑證信息。

JwtTokenStore 不會保存任何數(shù)據(jù),但是它在轉(zhuǎn)換令牌值以及授權(quán)信息方面與 DefaultTokenServices 所扮演的角色是一樣的。

4.1.3 令牌訪問端點

4.1.3.1 認證管理器

AuthorizationServerEndpointsConfifigurer通過設(shè)定以下屬性決定支持的授權(quán)類型(Grant Types):

  • authenticationManager

認證管理器,選擇了資源所有者密碼(password)授權(quán)類型的時候,請設(shè)置這個屬性注入一個 AuthenticationManager 對象。

  • userDetailsService

設(shè)置了這個屬性,需要有一個 UserDetailsService 接口的實現(xiàn)

  • authorizationCodeServices

用來設(shè)置授權(quán)碼服務(wù)(即 AuthorizationCodeServices 的實例對象),主要用于 "authorization_code" 授權(quán)碼類型模式。

  • implicitGrantServic

這個屬性用于設(shè)置隱式授權(quán)模式,用來管理隱式授權(quán)模式的狀態(tài)。

  • tokenGranter

授權(quán)將會交由自己來完全掌控,并且會忽略掉上面的這幾個屬性,這個屬性一般是用作拓展用途

4.1.3.2 令牌訪問點

框架的默認URL訪問鏈接如下列表

  • /oauth/authorize:授權(quán)端點。
  • /oauth/token:令牌端點。
  • /oauth/confifirm_access:用戶確認授權(quán)提交端點。
  • /oauth/error:授權(quán)服務(wù)錯誤信息端點。
  • /oauth/check_token:用于資源服務(wù)訪問的令牌解析端點。
  • /oauth/token_key:提供公有密匙的端點,如果你使用JWT令牌的話。

AuthorizationServerEndpointsConfifigurer 這個配置對象有一個叫做 pathMapping() 的方法用來配置端點URL鏈接,它有兩個參數(shù):

  • 第一個參數(shù):String 類型的,這個端點URL的默認鏈接。
  • 第二個參數(shù):String 類型的,你要進行替代的URL鏈接。

4.1.4 令牌訪問端點安全約束

  • AuthorizationServerSecurityConfigurer: :用來配置令牌端點(Token Endpoint)的安全約束

4.1.5 WEB安全配置

4.1.6 授權(quán)類型

4.1.6.1授權(quán)碼模式

資源擁有者打開客戶端,客戶端要求資源擁有者給予授權(quán),它將瀏覽器被重定向到授權(quán)服務(wù)器,重定向時會附加客戶端的身份信息

/uaa/oauth/authorize?client_id=c1&response_type=code&scope=all&redirect_uri=http://www.baidu.com

瀏覽器出現(xiàn)向授權(quán)服務(wù)器授權(quán)頁面,之后用戶同意授權(quán)

授權(quán)服務(wù)器將授權(quán)碼(AuthorizationCode)經(jīng)瀏覽器發(fā)送給client

客戶端拿著授權(quán)碼向授權(quán)服務(wù)器索要訪問access_token

/uaa/oauth/token?client_id=c1&client_secret=secret&grant_type=authorization_code&code=5PgfcD&redirect_uri=http://www.baidu.com

授權(quán)服務(wù)器返回令牌(access_token)

參數(shù)列表如下:

  • client_id:客戶端準入標識。
  • response_type:授權(quán)碼模式固定為code。
  • scope:客戶端權(quán)限。
  • client_secret:客戶端秘鑰。
  • grant_type:授權(quán)類型,填寫authorization_code,表示授權(quán)碼模式
  • code:授權(quán)碼,就是剛剛獲取的授權(quán)碼,注意:授權(quán)碼只使用一次就無效了,需要重新申請。
  • redirect_uri:申請授權(quán)碼時的跳轉(zhuǎn)url,一定和申請授權(quán)碼時用的redirect_uri一致。
4.1.6.2 簡化模式

資源擁有者打開客戶端,客戶端要求資源擁有者給予授權(quán),它將瀏覽器被重定向到授權(quán)服務(wù)器,重定向時會附加客戶端的身份信息

/uaa/oauth/authorize?client_id=c1&response_type=token&scope=all&redirect_uri=http://www.baidu.com

瀏覽器出現(xiàn)向授權(quán)服務(wù)器授權(quán)頁面,之后用戶同意授權(quán)

授權(quán)服務(wù)器將授權(quán)碼將令牌(access_token)以Hash的形式存放在重定向uri的fargment中發(fā)送給瀏覽器。fragment 主要是用來標識 URI 所標識資源里的某個資源,在 URI 的末尾通過 (#)作為 fragment 的開頭,其中 # 不屬于 fragment 的值。

4.1.6.3 密碼模式

資源擁有者將用戶名、密碼發(fā)送給客戶端

客戶端拿著資源擁有者的用戶名、密碼向授權(quán)服務(wù)器請求令牌(access_token)

/uaa/oauth/token?

client_id=c1&client_secret=secret&grant_type=password&username=shangsan&password=123

授權(quán)服務(wù)器將令牌(access_token)發(fā)送給client

4.1.6.4 客戶端模式

客戶端向授權(quán)服務(wù)器發(fā)送自己的身份信息,并請求令牌(access_token)

確認客戶端身份無誤后,將令牌(access_token)發(fā)送給client

/uaa/oauth/token?client_id=c1&client_secret=secret&grant_type=client_credentials

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

@Configuration
@EnableResourceServer
public class ResouceServerConfig extends ResourceServerConfigurerAdapter

@EnableResourceServer 注解自動增加了一個類型為 OAuth2AuthenticationProcessingFilter 的過濾器鏈

ResourceServerSecurityConfifigurer中主要包括:

  • tokenServices:ResourceServerTokenServices 類的實例,用來實現(xiàn)令牌服務(wù)。
  • tokenStore:TokenStore類的實例,指定令牌如何訪問,與tokenServices配置可選
  • resourceId:這個資源服務(wù)的ID,這個屬性是可選的,但是推薦設(shè)置并在授權(quán)服務(wù)中進行驗證。

其他的拓展屬性例如 tokenExtractor 令牌提取器用來提取請求中的令牌。

HttpSecurity配置這個與Spring Security類似:

請求匹配器,用來設(shè)置需要進行保護的資源路徑,默認的情況下是保護資源服務(wù)的全部路徑。

通過http.authorizeRequests()來設(shè)置受保護資源的訪問規(guī)則

其他的自定義權(quán)限保護規(guī)則通過 HttpSecurity 來進行配置。

RemoteTokenServices 資源服務(wù)器通過 HTTP 請求來解碼令牌,每次都請求授權(quán)服務(wù)器端點 /oauth/check_token

此處使用JWT校驗令牌

配置安全攔截機制

@EnableResourceServer 注解自動增加了一個類型為 OAuth2AuthenticationProcessingFilter 的過濾器鏈,此過濾器作用,主要是用來解析網(wǎng)關(guān)傳過來的用戶信息字符串,并存入安全上下文中

4.3 網(wǎng)關(guān)

網(wǎng)關(guān)整合 OAuth2.0作為OAuth2.0的資源服務(wù)器角色,實現(xiàn)接入客戶端權(quán)限攔截、令牌解析并轉(zhuǎn)發(fā)當前登錄用戶信息(jsonToken)給微服務(wù)

public class AuthFilter extends ZuulFilter

校驗客戶端token,驗證接入客戶端權(quán)限,并解析后明文token,轉(zhuǎn)發(fā)請求到微服務(wù)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot中EasyPoi實現(xiàn)自動新增序號的方法

    springboot中EasyPoi實現(xiàn)自動新增序號的方法

    本文主要介紹了EasyPoi實現(xiàn)自動新增序號,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java中的SynchronousQueue阻塞隊列及使用場景解析

    Java中的SynchronousQueue阻塞隊列及使用場景解析

    這篇文章主要介紹了Java中的SynchronousQueue阻塞隊列及使用場景解析,SynchronousQueue 是 Java 中的一個特殊的阻塞隊列,它的主要特點是它的容量為0,這意味著 SynchronousQueue不會存儲任何元素,需要的朋友可以參考下
    2023-12-12
  • Spring Boot打jar包后配置文件的外部優(yōu)化配置方法

    Spring Boot打jar包后配置文件的外部優(yōu)化配置方法

    這篇文章主要介紹了Spring Boot打jar包后配置文件的外部優(yōu)化配置方法,需要的朋友可以參考下
    2018-02-02
  • Java編程求二叉樹的鏡像兩種方法介紹

    Java編程求二叉樹的鏡像兩種方法介紹

    這篇文章主要介紹了Java編程求二叉樹的鏡像兩種方法介紹,分享了兩種方法,遞歸與非遞歸,每種方法又分別介紹了兩種解決思路,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Android中幾種圖片特效的處理的實現(xiàn)方法

    Android中幾種圖片特效的處理的實現(xiàn)方法

    這篇文章主要介紹了 Android中幾種圖片特效的處理的實現(xiàn)方法的相關(guān)資料,這里有放大縮小圖片,獲得圓角圖片,獲得帶倒影圖片的幾種方法,需要的朋友可以參考下
    2017-08-08
  • .idea文件夾里面iml文件的作用及說明

    .idea文件夾里面iml文件的作用及說明

    這篇文章主要介紹了.idea文件夾里面iml文件的作用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關(guān)于springboot使用rocketmq?RocketMQMessageListener參數(shù)問題

    關(guān)于springboot使用rocketmq?RocketMQMessageListener參數(shù)問題

    這篇文章主要介紹了springboot使用rocketmq?RocketMQMessageListener參數(shù)問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值需要的朋友可以參考下
    2022-11-11
  • Java中初始化List集合的6種方式詳解

    Java中初始化List集合的6種方式詳解

    這篇文章主要介紹了Java中初始化List集合的6種方式詳解,List 是 Java 開發(fā)中經(jīng)常會使用的集合,在使用List時需要進行初始化操作,今天我們就來看一下常用的幾種list集合初始化方式,需要的朋友可以參考下
    2023-10-10
  • maven插件maven-assembly-plugin打包歸納文件zip/tar使用

    maven插件maven-assembly-plugin打包歸納文件zip/tar使用

    java項目運行的文件需要jar或者war格式,同時還需要使用Java命令,本文主要介紹了maven插件maven-assembly-plugin打包歸納文件zip/tar使用,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • java中hashCode、equals的使用方法教程

    java中hashCode、equals的使用方法教程

    hashCode()和equals()定義在Object類中,這個類是所有java類的基類,所以所有的java類都繼承這兩個方法。下面這篇文章主要給大家介紹了關(guān)于java中hashCode、equals的使用方法,需要的朋友可以參考下。
    2017-12-12

最新評論