Spring Cloud Security簡介

1.概述

Spring Cloud Security模塊提供與Spring Boot應用程序中基於令牌的安全性相關的功能。

具體來說,它使基於OAuth2的SSO更加容易-支持在資源服務器之間中繼令牌,並使用嵌入式Zuul代理配置下游身份驗證。

在這篇快速文章中,我們將介紹如何使用Spring Boot客戶端應用程序,授權服務器和充當資源服務器的REST API配置這些功能。

請注意,在此示例中,我們只有一個使用SSO演示雲安全功能的客戶端應用程序-但是在典型情況下,我們將至少有兩個客戶端應用程序證明需要單點登錄。

2.快速啟動雲安全應用

讓我們從在Spring Boot應用程序中配置SSO開始

首先,我們需要添加spring-cloud-starter-oauth2依賴項:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-oauth2</artifactId>

 <version>2.2.2.RELEASE</version>

 </dependency>

這也將帶來spring-cloud-starter-security依賴性。

我們可以將任何社交網站配置為網站的Auth服務器,也可以使用自己的服務器。在我們的案例中,我們選擇了後一個選項,並配置了一個充當授權服務器的應用程序–該應用程序本地部署在http://localhost:7070/authserver.

我們的授權服務器使用JWT令牌。

另外,為了使任何客戶端都能夠檢索用戶的憑據,我們需要配置運行在端口9000上的資源服務器,並帶有可以提供這些憑據的端點。

在這裡,我們配置了一個/ user終結點,該終結點可以從http://localhost:9000/user.

有關如何設置授權服務器和資源服務器的更多詳細信息,請在此處查看我們以前的文章。

現在,我們可以在客戶端應用程序的配置類中添加註釋:

@Configuration

 @EnableOAuth2Sso

 public class SiteSecurityConfigurer

 extends WebSecurityConfigurerAdapter {



 @Override

 protected void configure(HttpSecurity http) throws Exception {

 // ...

 }

 }

任何需要身份驗證的請求都將重定向到授權服務器。為此,我們還必須定義服務器屬性:

security:

 oauth2:

 client:

 accessTokenUri: http://localhost:7070/authserver/oauth/token

 userAuthorizationUri: http://localhost:7070/authserver/oauth/authorize

 clientId: authserver

 clientSecret: passwordforauthserver

 resource:

 userInfoUri: http://localhost:9000/user

注意,我們需要在類路徑中具有spring-boot-starter-security才能找到上述配置。

3.中繼訪問令牌

在中繼令牌時,OAuth2客戶端會將其接收的OAuth2令牌轉發到傳出資源請求。

由於我們已經聲明了@EnableOauth2Sso批註,因此Spring Boot在請求範圍內添加了OAuth2ClientContext bean。基於此,我們可以在客戶端應用程序中創建自己的OAuth2RestTemplate

@Bean

 public OAuth2RestOperations restOperations(

 OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) {

 return new OAuth2RestTemplate(resource, context);

 }

一旦我們配置了bean ,上下文將把訪問令牌轉發到所請求的服務,並且在令牌過期時也會刷新令牌。

4.使用RestTemplate中繼OAuth令牌

我們以前定義的restOperations類型的豆OAuth2RestTemplate在我們的客戶端應用程序。因此,我們可以使用getForObject()的方法OAuth2RestTemplate發送必要的標記,從我們的客戶受保護的資源服務器的請求

首先,讓我們定義一個需要在資源服務器中進行身份驗證的端點:

@GetMapping("/person")

 @PreAuthorize("hasAnyRole('ADMIN', 'USER')")

 public @ResponseBody Person personInfo(){

 return new Person("abir", "Dhaka", "Bangladesh", 29, "Male");

 }

這是一個簡單的REST端點,它返回Person對象的JSON表示形式。

現在,我們可以使用getForObject()方法從客戶端應用程序發送請求,該方法會將令牌中繼到資源服務器

@Autowired

 private RestOperations restOperations;



 @GetMapping("/personInfo")

 public ModelAndView person() {

 ModelAndView mav = new ModelAndView("personinfo");

 String personResourceUrl = "http://localhost:9000/person";

 mav.addObject("person",

 restOperations.getForObject(personResourceUrl, String.class));



 return mav;

 }

5.為令牌中繼配置Zuul

如果我們想將令牌下游中繼到代理服務,則可以使用Spring Cloud Zuul嵌入式反向代理。

首先,我們需要添加Maven依賴項以使用Zuul:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-netflix-zuul</artifactId>

 </dependency>

接下來,我們需要在客戶端應用程序中的配置類上添加@ EnableZuulProxy批註:

@Configuration

 @EnableOAuth2Sso

 @EnableZuulProxy

 public class SiteSecurityConfigurer

 extends WebSecurityConfigurerAdapter {

 //...

 }

剩下要做的就是將Zuul配置屬性添加到我們的application.yml文件中:

zuul:

 sensitiveHeaders: Cookie,Set-Cookie

 routes:

 resource:

 path: /api/**

 url: http://localhost:9000

 user:

 path: /user/**

 url: http://localhost:9000/user

到達客戶端應用程序的/ api端點的任何請求都將重定向到資源服務器URL。我們還需要提供用戶憑證端點的URL。

六,結論

在這篇快速文章中,我們探討瞭如何將Spring Cloud Security與OAuth2和Zuul一起使用來配置安全授權和資源服務器,以及如何使用Oauth2RestTemplate和Embedded Zuul Proxy在服務器之間中繼OAuth2令牌。

與往常一樣,代碼可以在GitHub上獲得