溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用Spring Security與Oauth2.0

發(fā)布時(shí)間:2021-10-20 15:06:41 來(lái)源:億速云 閱讀:196 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“如何使用Spring Security與Oauth2.0”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何使用Spring Security與Oauth2.0”吧!

問(wèn)題

最近由于工作變動(dòng),我又開(kāi)始搞 Java 后臺(tái)了(做回老本行)。目前第一個(gè)工作項(xiàng)目是搞一個(gè)用戶(hù)認(rèn)證中心,于是便一腳踏入了 Spring Security 的坑里面。其實(shí)當(dāng)下比較流行的一套解決方案就是 Spring Security + Oauth3.0 + JWT 方式。可是當(dāng)我開(kāi)始集成 Spring Security 和 Oauth3.0 的時(shí)候,我眉頭一皺突然發(fā)現(xiàn)這個(gè)事情不簡(jiǎn)單。

<!--more-->

在創(chuàng)建 Springboot 工程時(shí),可以選擇以下的 Oauth3.0 依賴(lài):

spring-boot-starter-oauth3-client
spring-boot-starter-oauth3-resource-server
spring-cloud-starter-oauth3

我心想咋還這么多依賴(lài)包呢。本著面向百度編程的原則,從一眾“天下文章一大抄”的博客里發(fā)現(xiàn)他們還用的是另外兩個(gè)依賴(lài):

spring-security-oauth3
spring-security-oauth3-autoconfigure

這我就頭大了啊,咋還整得這么復(fù)雜呢。所以只能去扒官方文檔了。

官方文檔解釋

看到 Spring 官方對(duì)于 Oauth3.0 的解釋,他說(shuō)了這么一句

The Spring Security OAuth project is deprecated. The latest OAuth 2.0 support is provided by Spring Security. See the OAuth 2.0 Migration Guide for further details.

也就是說(shuō)原來(lái)的 Spring Security OAuth3.0 已經(jīng)廢棄了,有關(guān) OAuth3.0 的支持已經(jīng)集成到了 Spring Security 里面了。這我就懵了。。。emmm。也就是說(shuō)現(xiàn)在如果使用spring-security-oauth3,里面大部分方法都是被橫線劃掉的(被廢棄的)。為啥要這樣呢?

后來(lái)本著吃瓜的心態(tài),扒了扒 OAuth 和 Spring 社區(qū)的歷史。發(fā)現(xiàn)在 2018 年,Spring 社區(qū)就發(fā)布了聲明,說(shuō)是要逐漸停止現(xiàn)有的 OAuth3 支持,而在 Spring Security5 中構(gòu)建下一代 OAuth3.0 支持。原因是Oauth3 落地混亂:Spring Security OAuth、Spring Cloud Security、Spring Boot 1.5.x 以及當(dāng)時(shí)最新的 Spring Security5.x 中都提供了對(duì) OAuth3 的實(shí)現(xiàn)。因此官方要統(tǒng)一放在一個(gè)地方。

我想,這是個(gè)好事啊,省的讓大家不知道使用哪一個(gè)了。當(dāng)然官方也是很給力,不僅完成了對(duì) Oauth3.0 的支持,也加入了 OpenID Connect1.0 的支持。但是呢,社區(qū)又來(lái)了個(gè)騷操作:宣布不再支持授權(quán)服務(wù)器。因?yàn)楣俜秸J(rèn)為授權(quán)服務(wù)器是一種產(chǎn)品形態(tài),并非框架該完成的,其次目前已經(jīng)有很多商用和開(kāi)源的授權(quán)服務(wù)器了(例如 Keycloak、Okta)。但是一眾開(kāi)發(fā)者不服啊,在社區(qū)里進(jìn)行激烈討論。于是官方妥協(xié),發(fā)起了新的項(xiàng)目 spring-authorization-server,目前已經(jīng)迭代到了0.0.3版本。

現(xiàn)狀 & 遷移

吃完瓜,來(lái)看看這幾個(gè)包現(xiàn)在是什么狀態(tài)。

spring-security-oauth3  -> 被廢棄,建議不使用,否則后期無(wú)法維護(hù)

spring-security-oauth3-autoconfigure  -> 自動(dòng)配置,沒(méi)有用處
spring-boot-starter-oauth3-client -> 最新
spring-boot-starter-oauth3-resource-server  -> 最新
spring-cloud-starter-oauth3 -> 引用 spring-security-oauth3,但尚未標(biāo)注被廢棄

這樣就比較明確了,現(xiàn)在的項(xiàng)目中需要依據(jù)該服務(wù)的用途去引用對(duì)應(yīng)的包。

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

如果服務(wù)想做成授權(quán)服務(wù)器,暫時(shí)只能引用spring-cloud-starter-oauth3。因?yàn)檫@個(gè)包也是引用了spring-security-oauth3,但尚未標(biāo)注@Deprecated,然后仍舊使用@EnableAuthorityServer注解進(jìn)行配置。等待spring-authorization-server成熟,需要切換過(guò)來(lái)。

客戶(hù)端

現(xiàn)在如果要開(kāi)發(fā)客戶(hù)端,只需要引用spring-boot-starter-oauth3-client,也只需要在原來(lái)的 SpringSecurity 的配置類(lèi)中,調(diào)用.oauth3Client()即可配置,不需要以前的@EnableOAuth3Client注解了。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
			.authorizeRequests()
				.anyRequest().authenticated()
				.and()
			.formLogin()
				.loginPage("/login")
				.failureUrl("/login-error")
				.permitAll()
				.and()
			.oauth3Client(); //
	}

}

除此之外,也需要配置WebClientOAuth3AuthorizedClientManager這兩個(gè) Bean。具體如何實(shí)現(xiàn),先挖個(gè)坑,以后再填。

資源服務(wù)器

資源服務(wù)器也只需要引用spring-boot-starter-oauth3-resource-server,若使用 JWK 方式,其配置如下(也僅僅是調(diào)用.oauth3ResourceServer()

@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Value("${spring.security.oauth3.resourceserver.jwt.jwk-set-uri}")
    private String jwkSetUri;

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http
                .oauth3ResourceServer(OAuth3ResourceServerConfigurer::jwt)
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/message/**").hasAuthority("SCOPE_all")
                .anyRequest().authenticated();
    }

    @Bean
    JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri(this.jwkSetUri).build();
    }
}

到此,相信大家對(duì)“如何使用Spring Security與Oauth2.0”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI