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

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

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

基本概念

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

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

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

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

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

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

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

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

  • RBAC

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

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

Spring Boot Security

對(duì)所有進(jìn)入系統(tǒng)的請(qǐng)求進(jìn)行攔截,校驗(yàn)每個(gè)請(qǐng)求是否能夠訪問(wèn)它所期望的資源,通過(guò)Filter實(shí)現(xiàn)

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

初始化Spring Security時(shí),初始化一個(gè)類(lèi)型為org.springframework.security.web.FilterChainProxy的過(guò)濾器,

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

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

2.2 認(rèn)證過(guò)程

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

2. 然后過(guò)濾器將Authentication提交至認(rèn)證管理器(AuthenticationManager)進(jìn)行認(rèn)證

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

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

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

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

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

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

2.3 密碼處理

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

  • 下聲明即可

常見(jiàn)的密碼編碼器有:

NoOpPasswordEncoder、BCryptPasswordEncoder、Pbkdf2PasswordEncode、SCryptPasswordEncoder

2.4 授權(quán)過(guò)程

已認(rèn)證用戶訪問(wèn)受保護(hù)的web資源將被SecurityFilterChain中的 FilterSecurityInterceptor 的子類(lèi)攔截。

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

此處會(huì)從安全上下文中獲取用戶:

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

再進(jìn)行比對(duì)和判斷。

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

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

  • AffirmativeBased 只要有一個(gè)贊成票,則表示同意用戶訪問(wèn)
  • ConsensusBased:贊成票多余反對(duì)票,則表示同意用戶訪問(wèn)
  • UnanimousBased:只要有一個(gè)反對(duì)票,則表示反對(duì)用戶訪問(wèn)

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

解決方法1:

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

httpSecurity.csrf().disable()

解決方法2:

表單添加隱藏域:

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

2.5 實(shí)際應(yīng)用

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

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

2.5.1 會(huì)話控制

  • Spring Security會(huì)為每個(gè)登錄成功的用戶會(huì)新建一個(gè)Session
httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
  • session超時(shí)、session失效后,通過(guò)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 ,實(shí)現(xiàn)用戶退出成功時(shí)的處理。如果指定了這個(gè)選項(xiàng)那么logoutSuccessUrl() 的設(shè)置被忽略;

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

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

2.5.2 web授權(quán)

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

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()

保護(hù)URL常用的方法有:

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

2.5.3.方法授權(quán)

以在任何 @Configuration 實(shí)例上使用 @EnableGlobalMethodSecurity 注釋來(lái)啟用基于注解的安全性。

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

例如:

匿名訪問(wèn)

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

方法可匿名訪問(wèn),底層使用WebExpressionVoter投票器

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

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

另外,還有注解@PostAuthorize

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

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

3.1 分布式認(rèn)證需求

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

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

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

應(yīng)用接入認(rèn)證

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

3.2 選型分析

3.2.1 基于Session認(rèn)證

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

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

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

3.2.2 基于Token認(rèn)證

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

3.2.3 技術(shù)方案

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

  • 適合統(tǒng)一認(rèn)證的機(jī)制,客戶端、一方應(yīng)用、三方應(yīng)用都遵循一致的認(rèn)證機(jī)制。
  • token認(rèn)證方式對(duì)第三方應(yīng)用接入更適合,因?yàn)樗_(kāi)放,可使用當(dāng)前有流行的開(kāi)放協(xié)議Oauth2.0、JWT等。
  • 一般情況服務(wù)端無(wú)需存儲(chǔ)會(huì)話信息,減輕了服務(wù)端的壓力。

3.3 Oauth2.0

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

OAauth2.0包括以下角色:

客戶端

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

資源擁有者

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

資源服務(wù)器

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

服務(wù)提供商會(huì)給準(zhǔn)入的接入方一個(gè)身份,用于接入時(shí)的憑據(jù):

  • client_id:客戶端標(biāo)識(shí)
  • client_secret:客戶端秘鑰

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

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

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

Spring Cloud Security OAuth2

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

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

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

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

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

OAuth2AuthenticationProcessingFilter用來(lái)對(duì)請(qǐng)求給出的身份令牌解析鑒權(quán)。

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

可以使用

@Configuration
@EnableAuthorizationServer

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

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

4.1.1 客戶端詳情

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

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

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

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

4.1.2令牌管理服務(wù)

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

  • InMemoryTokenStore

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

  • JdbcTokenStore

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

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

  • JwtTokenStore:

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

另外一個(gè)缺點(diǎn)就是這個(gè)令牌占用的空間會(huì)比較大,如果你加入了比較多用戶憑證信息。

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

4.1.3 令牌訪問(wèn)端點(diǎn)

4.1.3.1 認(rèn)證管理器

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

  • authenticationManager

認(rèn)證管理器,選擇了資源所有者密碼(password)授權(quán)類(lèi)型的時(shí)候,請(qǐng)?jiān)O(shè)置這個(gè)屬性注入一個(gè) AuthenticationManager 對(duì)象。

  • userDetailsService

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

  • authorizationCodeServices

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

  • implicitGrantServic

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

  • tokenGranter

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

4.1.3.2 令牌訪問(wèn)點(diǎn)

框架的默認(rèn)URL訪問(wèn)鏈接如下列表

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

AuthorizationServerEndpointsConfifigurer 這個(gè)配置對(duì)象有一個(gè)叫做 pathMapping() 的方法用來(lái)配置端點(diǎn)URL鏈接,它有兩個(gè)參數(shù):

  • 第一個(gè)參數(shù):String 類(lèi)型的,這個(gè)端點(diǎn)URL的默認(rèn)鏈接。
  • 第二個(gè)參數(shù):String 類(lèi)型的,你要進(jìn)行替代的URL鏈接。

4.1.4 令牌訪問(wèn)端點(diǎn)安全約束

  • AuthorizationServerSecurityConfigurer: :用來(lái)配置令牌端點(diǎn)(Token Endpoint)的安全約束

4.1.5 WEB安全配置

4.1.6 授權(quán)類(lèi)型

4.1.6.1授權(quán)碼模式

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

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

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

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

客戶端拿著授權(quán)碼向授權(quán)服務(wù)器索要訪問(wèn)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:客戶端準(zhǔn)入標(biāo)識(shí)。
  • response_type:授權(quán)碼模式固定為code。
  • scope:客戶端權(quán)限。
  • client_secret:客戶端秘鑰。
  • grant_type:授權(quán)類(lèi)型,填寫(xiě)authorization_code,表示授權(quán)碼模式
  • code:授權(quán)碼,就是剛剛獲取的授權(quán)碼,注意:授權(quán)碼只使用一次就無(wú)效了,需要重新申請(qǐng)。
  • redirect_uri:申請(qǐng)授權(quán)碼時(shí)的跳轉(zhuǎn)url,一定和申請(qǐng)授權(quán)碼時(shí)用的redirect_uri一致。
4.1.6.2 簡(jiǎn)化模式

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

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

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

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

4.1.6.3 密碼模式

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

客戶端拿著資源擁有者的用戶名、密碼向授權(quán)服務(wù)器請(qǐng)求令牌(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ā)送自己的身份信息,并請(qǐng)求令牌(access_token)

確認(rèn)客戶端身份無(wú)誤后,將令牌(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 注解自動(dòng)增加了一個(gè)類(lèi)型為 OAuth2AuthenticationProcessingFilter 的過(guò)濾器鏈

ResourceServerSecurityConfifigurer中主要包括:

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

其他的拓展屬性例如 tokenExtractor 令牌提取器用來(lái)提取請(qǐng)求中的令牌。

HttpSecurity配置這個(gè)與Spring Security類(lèi)似:

請(qǐng)求匹配器,用來(lái)設(shè)置需要進(jìn)行保護(hù)的資源路徑,默認(rèn)的情況下是保護(hù)資源服務(wù)的全部路徑。

通過(guò)http.authorizeRequests()來(lái)設(shè)置受保護(hù)資源的訪問(wèn)規(guī)則

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

RemoteTokenServices 資源服務(wù)器通過(guò) HTTP 請(qǐng)求來(lái)解碼令牌,每次都請(qǐng)求授權(quán)服務(wù)器端點(diǎn) /oauth/check_token

此處使用JWT校驗(yàn)令牌

配置安全攔截機(jī)制

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

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

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

public class AuthFilter extends ZuulFilter

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

總結(jié)

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

相關(guān)文章

  • 老生常談Java動(dòng)態(tài)編譯(必看篇)

    老生常談Java動(dòng)態(tài)編譯(必看篇)

    下面小編就為大家?guī)?lái)一篇老生常談Java動(dòng)態(tài)編譯(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java volatile關(guān)鍵字原理剖析與實(shí)例講解

    Java volatile關(guān)鍵字原理剖析與實(shí)例講解

    volatile是Java提供的一種輕量級(jí)的同步機(jī)制,Java?語(yǔ)言包含兩種內(nèi)在的同步機(jī)制:同步塊(或方法)和?volatile?變量,本文將詳細(xì)為大家總結(jié)Java volatile關(guān)鍵字,通過(guò)詳細(xì)的代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • springboot項(xiàng)目啟動(dòng),但是訪問(wèn)報(bào)404錯(cuò)誤的問(wèn)題

    springboot項(xiàng)目啟動(dòng),但是訪問(wèn)報(bào)404錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了springboot項(xiàng)目啟動(dòng),但是訪問(wèn)報(bào)404錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 三種簡(jiǎn)單排序算法(使用java實(shí)現(xiàn))

    三種簡(jiǎn)單排序算法(使用java實(shí)現(xiàn))

    下面小編就為大家?guī)?lái)一篇三種簡(jiǎn)單排序算法(使用java實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • 使用Maven打包、發(fā)布、配置版本號(hào)命令

    使用Maven打包、發(fā)布、配置版本號(hào)命令

    在軟件開(kāi)發(fā)過(guò)程中,打包和發(fā)布是關(guān)鍵步驟,本文介紹了如何在打包和發(fā)布時(shí)跳過(guò)測(cè)試,如何指定項(xiàng)目版本號(hào),以及如何指定配置文件,提供了實(shí)用的技巧和方法,希望對(duì)開(kāi)發(fā)者有所幫助
    2024-09-09
  • Java仿Windows記事本源代碼分享

    Java仿Windows記事本源代碼分享

    這篇文章主要為大家詳細(xì)介紹了Java仿Windows記事本源代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 使用fileupload組件實(shí)現(xiàn)文件上傳功能

    使用fileupload組件實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了使用fileupload實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • java實(shí)現(xiàn)水波紋擴(kuò)散效果

    java實(shí)現(xiàn)水波紋擴(kuò)散效果

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水波紋擴(kuò)散效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作

    SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作

    SpringBoot中的 redistemplate 是一個(gè)用于操作 Redis 數(shù)據(jù)庫(kù)的高級(jí)模板類(lèi),它提供了一組方法,可以方便地執(zhí)行常見(jiàn)的 Redis 操作,如存儲(chǔ)、檢索和刪除數(shù)據(jù),本文給大家介紹了SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作,需要的朋友可以參考下
    2025-02-02
  • SpringCloud之Hystrix的詳細(xì)使用

    SpringCloud之Hystrix的詳細(xì)使用

    熔斷機(jī)制是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制,當(dāng)扇出鏈路的某個(gè)微服務(wù)出錯(cuò)不可用或者響應(yīng)時(shí)間太長(zhǎng),會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯(cuò)誤的相應(yīng)信息,本文重點(diǎn)給大家介紹SpringCloud Hystrix使用,感興趣的朋友一起看看吧
    2022-01-01

最新評(píng)論

佛冈县| 沾化县| 金阳县| 抚州市| 罗江县| 竹北市| 黑水县| 攀枝花市| 客服| 宜春市| 周宁县| 宁波市| 石柱| 托里县| 福泉市| 平定县| 荃湾区| 师宗县| 潜山县| 宁化县| 五家渠市| 贵港市| 遂平县| 德安县| 万源市| 托克逊县| 龙川县| 呼图壁县| 扬中市| 南漳县| 从江县| 安义县| 册亨县| 台中县| 奇台县| 岗巴县| 格尔木市| 阿克陶县| 吴桥县| 通化县| 柏乡县|