真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot從1.x升級(jí)到2.x后單點(diǎn)登陸SSO問(wèn)題的解決方法

這篇文章主要介紹“Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法”,在日常操作中,相信很多人在Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司是一家服務(wù)多年做網(wǎng)站建設(shè)策劃設(shè)計(jì)制作的公司,為廣大用戶提供了成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,成都網(wǎng)站設(shè)計(jì),廣告投放平臺(tái),成都做網(wǎng)站選創(chuàng)新互聯(lián)建站,貼合企業(yè)需求,高性價(jià)比,滿足客戶不同層次的需求一站式服務(wù)歡迎致電。

解決Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸(SSO)問(wèn)題

> ??在學(xué)習(xí)Spring Cloud 時(shí),遇到了授權(quán)服務(wù)oauth 相關(guān)內(nèi)容時(shí),總是一知半解,因此決定先把Spring Security 、Spring Security Oauth3 等權(quán)限、認(rèn)證相關(guān)的內(nèi)容、原理及設(shè)計(jì)學(xué)習(xí)并整理一遍。本系列文章就是在學(xué)習(xí)的過(guò)程中加強(qiáng)印象和理解所撰寫(xiě)的,如有侵權(quán)請(qǐng)告知。

> 項(xiàng)目環(huán)境: > - JDK1.8 > - Spring boot 2.x > - Spring Security 5.x

??前期基本上已經(jīng)將 Spring Security相關(guān)的內(nèi)容寫(xiě)得差不多了,所以最近在整理Spring Sexurity Oauh3 相關(guān)的內(nèi)容,但在進(jìn)行到單點(diǎn)登陸(OSS)時(shí),有一個(gè)問(wèn)題一直困擾了我很久,由于網(wǎng)上有關(guān)于Spring Boot 1.x 升級(jí)到Spring Boot 2.x 后單點(diǎn)登陸相關(guān)的問(wèn)題解決資料很少,特此在這里專(zhuān)門(mén)列一篇文章來(lái)描述升級(jí)過(guò)程中遇到的一些問(wèn)題、問(wèn)題表現(xiàn)現(xiàn)象以及我是如何解決這些問(wèn)題的。

問(wèn)題一: spring boot 2 中去除了@EnableOAuth3Sso ?

??首先很明確的告訴你,并沒(méi)有?。〉珵槭裁匆肓?spring-security-oauth3maven依賴(lài) IDEA提示 @EnableOAuth3Sso 找不到呢? 首先我們找到官方Spring Boot 2.x 升級(jí)文檔,我們會(huì)發(fā)現(xiàn)其中有關(guān)于Oauth3 相關(guān)的介紹:

> OAuth 2.0 Support Functionality from the Spring Security OAuth project is being migrated to core Spring Security. OAuth 2.0 client support has already been added and additional features will be migrated in due course.

> If you depend on Spring Security OAuth features that have not yet been migrated you will need to add org.springframework.security.oauth:spring-security-oauth3 and configure things manually. If you only need OAuth 2.0 client support you can use the auto-configurationprovided by Spring Boot 2.0. We’re also continuing to support Spring Boot 1.5 so older applications can continue to use that until an upgrade path is provided.

?? 我們可以大致明白 官方 2.x 正在將 Spring Security OAuth項(xiàng)目的功能遷移到 Spring Security 中。 但最值得注意的是其中有這么一段話 If you only need OAuth 2.0 client support you can use the auto-configurationprovided by Spring Boot 2.0.(如果你想要在Spring Boot 2.0(及以上)版本中使用 Oauth3 客戶端 相關(guān)的功能 需要使用 auto-configuration)。

??根據(jù)這個(gè)提示,我們找到 官方 auto-configuration文檔 ,一進(jìn)來(lái) 就告訴我們需要用到的最小maven依賴(lài):

        
            org.springframework.boot
            spring-boot-starter-security
        
        
            org.springframework.security.oauth.boot
            spring-security-oauth3-autoconfigure
            2.1.7.RELEASE
        

??按照官方文檔配置成功引用到了@EnableOAuth3Sso ,至此,該問(wèn)題得到解決!

問(wèn)題二: 單點(diǎn)登陸授權(quán)過(guò)程中回調(diào)到客戶端卻提示401(未授權(quán))問(wèn)題 ?

####一、 SSO 客戶端相關(guān)配置

ClientSecurityConfig 配置
@Configuration
@EnableOAuth3Sso  // SSo自動(dòng)配置引用
public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
                .csrf().disable();
    }

}

這個(gè)配置是按照 官方 auto-configuration文檔  推薦的配置。

application.yml 配置
auth-server: http://localhost:9090 # authorization服務(wù)地址


security:
  oauth3:
    client:
      user-authorization-uri: ${auth-server}/oauth/authorize #請(qǐng)求認(rèn)證的地址
      access-token-uri: ${auth-server}/oauth/token #請(qǐng)求令牌的地址
    resource:
      jwt:
        key-uri: ${auth-server}/oauth/token_key #解析jwt令牌所需要密鑰的地址,服務(wù)啟動(dòng)時(shí)會(huì)調(diào)用 授權(quán)服務(wù)該接口獲取jwt key,所以務(wù)必保證授權(quán)服務(wù)正常
    sso:
      login-path: /login #指向登錄頁(yè)面的路徑,即OAuth3授權(quán)服務(wù)器觸發(fā)重定向到客戶端的路徑 ,默認(rèn)為 /login
spring:
  profiles:
    active: client1

??由于我們要多客戶端單點(diǎn)測(cè)試,這里使用Spring boot 的多環(huán)境配置,這里有關(guān)授權(quán)服務(wù)的配置不在描述,以及默認(rèn)搭建好了一個(gè)可用的授權(quán)服務(wù)(如果不清楚如何搭建Oauth3的授權(quán)服務(wù)和資源服務(wù),可以關(guān)注我,后續(xù)會(huì)出相關(guān)文章)。

application-client1.yml 配置
    server:
      port: 8091
    
    security:
      oauth3:
        client:
          client-id: client1
          client-secret: 123456
測(cè)試接口
@RestController
@Slf4j
public class TestController {

    @GetMapping("/client/{clientId}")
    public String getClient(@PathVariable String clientId) {
        return clientId;
    }

}

?? 至此問(wèn)我們完成了一個(gè)最基本的SSO客戶端,啟動(dòng)項(xiàng)目。

####二、 問(wèn)題描述及現(xiàn)象 ??瀏覽器上訪問(wèn)測(cè)試接口 localhost:8091/client/1 ,跳轉(zhuǎn)到授權(quán)服務(wù)登陸界面,登陸成功后,跳轉(zhuǎn)回到客戶端的 /login 地址 (即 我們 配置的 spring.security.sso.login-path ),正常情況下會(huì)再次跳轉(zhuǎn)到 localhost:8091/client/1(這次已經(jīng)是認(rèn)證成功后訪問(wèn))。這整個(gè)流程就是Oauth3 的授權(quán)碼模式流程。但現(xiàn)在有這么一個(gè)問(wèn)題,在授權(quán)服務(wù)回調(diào)到客戶端的 /login 地址時(shí),瀏覽器顯示 HTTP ERROR 401, 如下圖: Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法

??從圖中我們可以看到,授權(quán)服務(wù)成功的返回了授權(quán)碼,但由于我們客戶端存在問(wèn)題,出現(xiàn) 401 ,導(dǎo)致整個(gè)授權(quán)碼模式流程中斷。 在看 官方 auto-configuration文檔  過(guò)程中,無(wú)意間發(fā)現(xiàn)

>Also note that since all endpoints are secure by default, this includes any default error handling endpoints, for example, the endpoint "/error". This means that if there is some problem during Single Sign On that requires the application to redirect to the "/error" page, then this can cause an infinite redirect between the identity provider and the receiving application. >First, think carefully about making an endpoint insecure as you may find that the behavior is simply evidence of a different problem. However, this behavior can be addressed by configuring the application to permit "/error":

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/error").permitAll()
                .anyRequest().authenticated();
    }
}

??大致意思就是:由于默認(rèn)情況下所有端點(diǎn)都是安全的,因此這包括任何默認(rèn)錯(cuò)誤處理端點(diǎn),例如端點(diǎn)“/ error”。這意味著如果單點(diǎn)登錄期間存在某些問(wèn)題,需要應(yīng)用程序重定向到“/ error”頁(yè)面,則這會(huì)導(dǎo)致身份提供程序和接收應(yīng)用程序之間的無(wú)限重定向。

??根據(jù)這個(gè)提示,我開(kāi)始DEBUG,果然正如文檔所說(shuō),單點(diǎn)登錄期間存在某些問(wèn)題重定向到了/error,所以我們將 /error 配置成無(wú)權(quán)限訪問(wèn),重啟再次訪問(wèn)測(cè)試接口,這次的錯(cuò)誤界面提示就很明顯了: Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法

??既然明顯的提示 Unauthorized 了,那我們就來(lái)一步一步的DEBUG 看看單點(diǎn)期間出現(xiàn)的問(wèn)題點(diǎn)是什么。

####三、 問(wèn)題排查及解決方案 ??從之前的現(xiàn)象描述我們可以知道問(wèn)題點(diǎn)在授權(quán)碼回來(lái)后去調(diào)用獲取token這里出現(xiàn)問(wèn)題了,那么根據(jù)源碼查看,獲取token這塊步驟在 OAuth3ClientAuthenticationProcessingFilter 過(guò)濾器內(nèi)部,其關(guān)鍵代碼如下:

    @Override
	public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
			throws AuthenticationException, IOException, ServletException {

		OAuth3AccessToken accessToken;
		try {
			accessToken = restTemplate.getAccessToken();  // 1 調(diào)用授權(quán)服務(wù)獲取token 
		} catch (OAuth3Exception e) {
			BadCredentialsException bad = new BadCredentialsException("Could not obtain access token", e);
			publish(new OAuth3AuthenticationFailureEvent(bad));
			throw bad;			
		}
		try {
			OAuth3Authentication result = tokenServices.loadAuthentication(accessToken.getValue());  // 成功后從token中解析  OAuth3Authentication 信息
			if (authenticationDetailsSource!=null) {
				request.setAttribute(OAuth3AuthenticationDetails.ACCESS_TOKEN_VALUE, accessToken.getValue());
				request.setAttribute(OAuth3AuthenticationDetails.ACCESS_TOKEN_TYPE, accessToken.getTokenType());
				result.setDetails(authenticationDetailsSource.buildDetails(request));
			}
			publish(new AuthenticationSuccessEvent(result));
			return result;
		}
		catch (InvalidTokenException e) {
			BadCredentialsException bad = new BadCredentialsException("Could not obtain user details from token", e);
			publish(new OAuth3AuthenticationFailureEvent(bad));
			throw bad;			
		}

	}

??我們把斷點(diǎn)打到這里,Debug下,果然不出所料,在獲取token時(shí)異常了,異常信息為 : Possible CSRF detected - state parameter was required but no state could be found ,debug截圖如下: Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法

??查閱網(wǎng)上資料有一下說(shuō)法:

> 本地開(kāi)發(fā),auth server與client都是localhost,造成JSESSIONID相互影響問(wèn)題。可以通過(guò)配置client的context-path或者session名稱(chēng)來(lái)解決

?? 根據(jù)這個(gè)描述,我嘗試通過(guò)修改 session名稱(chēng)來(lái)解決:

server:
  servlet:
    session:
      cookie:
        name: OAUTH2CLIENTSESSION  # 解決  Possible CSRF detected - state parameter was required but no state could be found  問(wèn)題

?? 重啟項(xiàng)目,測(cè)試SSO,完美解決?。?!

到此,關(guān)于“Spring Boot 從1.x升級(jí)到 2.x 后 單點(diǎn)登陸SSO問(wèn)題的解決方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


分享標(biāo)題:SpringBoot從1.x升級(jí)到2.x后單點(diǎn)登陸SSO問(wèn)題的解決方法
鏈接分享:http://weahome.cn/article/jcjiho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部