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上獲得。