Spring Cloud Security

时间:2022-12-02 14:01:48

Spring Cloud Security

Spring Cloud Security 提供了一组用于构建安全的原语 应用程序和服务,只需大惊小怪。声明性模型 可以在外部(或集中)进行大量配置,以便 实施大型合作、远程组件系统, 通常使用*标识管理服务。它也非常 易于在Cloud Foundry等服务平台中使用。建立在 Spring Boot and Spring Security OAuth2 我们可以快速创建以下系统 实现常见模式,如单点登录、令牌中继和令牌 交换。

在未来的主要版本中,此项目中包含的功能将移至相应的项目。

Spring Cloud 是在非限制性 Apache 2.0 许可证下发布的。如果您想为文档的这一部分做出贡献,或者如果您发现错误,请在github 的项目中找到源代码和问题跟踪器。

快速入门

OAuth2 单点登录

这是一个带有HTTP Basic的Spring Cloud“Hello World”应用程序。 身份验证和单个用户帐户:

app.groovy

@Grab('spring-boot-starter-security')
@Controller
class Application {

@RequestMapping('/')
String home() {
'Hello World'
}

}

您可以运行它并查看密码日志(用户名为“user”)。到目前为止,这只是Spring Boot应用程序的默认设置。​​spring run app.groovy​

下面是一个带有OAuth2 SSO的Spring Cloud应用程序:

app.groovy

@Controller
@EnableOAuth2Sso
class Application {

@RequestMapping('/')
String home() {
'Hello World'
}

}

发现差异?这个应用程序实际上的行为与 前一个,因为它不知道它是OAuth2 credentals 还。

您可以非常轻松地在github中注册应用程序,因此请尝试以下情况: 想要在您自己的域中使用生产应用。如果您愿意测试 localhost:8080,然后在应用程序中设置这些属性 配置:

应用程序.yml

security:
oauth2:
client:
clientId: bd1c0a783ccdd1c9b9e4
clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false

运行上面的应用程序,它将重定向到 GitHub 进行授权。如果 您已经登录到GitHub,您甚至不会注意到它已经 认证。仅当你的应用符合以下条件时,这些凭据才有效 在端口 8080 上运行。

限制客户端在获取访问令牌时请求的范围 您可以设置(逗号分隔或 YAML 中的数组)。由 默认情况下,范围为空,由授权服务器 确定默认值应该是什么,通常取决于 它持有的客户端注册。​​security.oauth2.client.scope​

上面的例子都是Groovy脚本。如果你想写 在Java(或Groovy)中相同的代码,您需要添加Spring Security OAuth2 到类路径(例如,请参阅此处的示例)。

OAuth2 受保护的资源

您想使用 OAuth2 令牌保护 API 资源吗?这是一个 简单示例(与上面的客户端配对):

app.groovy

@Grab('spring-cloud-starter-security')
@RestController
@EnableResourceServer
class Application {

@RequestMapping('/')
def home() {
[message: 'Hello World']
}

}

应用程序.yml

security:
oauth2:
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false

更多详情

单点登录

所有 OAuth2 SSO 和资源服务器功能都迁移到 Spring Boot 在 1.3 版中。您可以在Spring 引导用户指南中找到文档。

令牌中继

令牌中继是 OAuth2 使用者充当客户端和 将传入令牌转发到传出资源请求。这 使用者可以是纯客户端(如 SSO 应用程序)或资源 服务器。

春季云网关中的客户端令牌中继

如果你的应用也有Spring 云网关嵌入式反向代理然后您 可以要求它将 OAuth2 访问令牌转发到下游服务 它是代理。因此,上面的SSO应用程序可以简单地增强,例如 这:

应用.java

@Autowired
private TokenRelayGatewayFilterFactory filterFactory;

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("resource", r -> r.path("/resource")
.filters(f -> f.filter(filterFactory.apply()))
.uri("http://localhost:9000"))
.build();
}

或者这个

application.yaml

spring:
cloud:
gateway:
routes:
- id: resource
uri: http://localhost:9000
predicates:
- Path=/resource
filters:
- TokenRelay=

它将(除了登录用户并获取令牌) 将身份验证令牌下游传递到服务(在本例中)。​​/resource​

要为 Spring Cloud 网关启用此功能,请添加以下依赖项

  • ​org.springframework.boot:spring-boot-starter-oauth2-client​
  • ​org.springframework.cloud:spring-cloud-starter-security​

它是如何工作的?筛选器从当前经过身份验证的用户中提取访问令牌, 并将其放在下游请求的请求标头中。

有关完整的工作示例,请参阅此项目。

默认实现使用 byuse 使用内存中数据存储。如果需要更强大的解决方案,则需要提供自己的实现。​​ReactiveOAuth2AuthorizedClientService​​​​TokenRelayGatewayFilterFactory​​​​ReactiveOAuth2AuthorizedClientService​

客户端令牌中继

如果您的应用程序是面向 OAuth2 客户端的用户(即具有声明者),那么它具有来自 Spring Boot 的请求范围。您可以 从此上下文创建自己的上下文和 自动连线,然后上下文将 始终将访问令牌转发到下游,同时刷新访问 令牌在过期时自动。(这些是春天的特点 安全性和春季启动。​​@EnableOAuth2Sso​​​​@EnableOAuth2Client​​​​OAuth2ClientContext​​​​OAuth2RestTemplate​​​​OAuth2ProtectedResourceDetails​

Spring 引导 (1.4.1) 不会自动创建,如果你正在使用令牌。在这种情况下,您需要创建自己的并对其进行配置。​​OAuth2ProtectedResourceDetails​​​​client_credentials​​​​ClientCredentialsResourceDetails​​​​@ConfigurationProperties("security.oauth2.client")​

Zuul 代理中的客户端令牌中继

如果你的应用也有Spring 云 Zuul嵌入式反向代理(使用)然后你 可以要求它将 OAuth2 访问令牌转发到下游服务 它是代理。因此,上面的SSO应用程序可以简单地增强,例如 这:​​@EnableZuulProxy​

app.groovy

@Controller
@EnableOAuth2Sso
@EnableZuulProxy
class Application {

}

它将(除了登录用户并获取令牌) 将身份验证令牌下游传递到服务。如果这些服务是实现的,那么它们将在 正确的标头。​​/proxy/*​​​​@EnableResourceServer​

它是如何工作的?注释拉入(您可以在 传统应用程序),这反过来又会触发一些自动配置 a,它本身被激活,因为 Zuul 在 类路径 (via)。筛选器仅从当前经过身份验证的用户中提取访问令牌, 并将其放在下游请求的请求标头中。​​@EnableOAuth2Sso​​​​spring-cloud-starter-security​​​​ZuulFilter​​​​@EnableZuulProxy​

Spring 引导不会自动创建所需的。在这种情况下,如果需要,您需要创建自己的socan刷新令牌。​​OAuth2RestOperations​​​​refresh_token​​​​OAuth2RestOperations​​​​OAuth2TokenRelayFilter​

资源服务器令牌中继

如果您的应用程序有您可能想要中继 传入令牌下游到其他服务。如果您使用 ato 联系下游服务,那么这只是一个 如何创建具有正确上下文的模板的问题。​​@EnableResourceServer​​​​RestTemplate​

如果您的服务用于对传入进行身份验证 令牌(即它正在使用配置),然后您可以简单地创建一个使用自动连线(它将由 在到达后端代码之前进行身份验证过程)。等效 (使用 Spring Boot 1.4),您可以注入 a并抓取它的 您的配置。例如:​​UserInfoTokenServices​​​​security.oauth2.user-info-uri​​​​OAuth2RestTemplate​​​​OAuth2ClientContext​​​​UserInfoRestTemplateFactory​​​​OAuth2RestTemplate​

我的配置.java

@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}

然后,此 rest 模板将具有身份验证过滤器使用的相同(请求范围),因此您可以 使用它来发送具有相同访问令牌的请求。​​OAuth2ClientContext​

如果您的应用未使用但仍是客户端 (即它声明者),然后 与 弹簧安全云 任何用户 从安威尔也向前创建 令 牌。默认情况下,此功能作为 MVC 处理程序实现 拦截器,所以它只在Spring MVC中工作。如果您没有使用 MVC 您可以使用自定义过滤器或 AOP 拦截器包装 ANTO 提供相同的功能。​​UserInfoTokenServices​​​​@EnableOAuth2Client​​​​@EnableOAuth2Sso​​​​OAuth2RestOperations​​​​@Autowired​​​​OAuth2Context​​​​AccessTokenContextRelay​

这是一个基本的 显示使用已创建的自动连线 REST 模板的示例 其他地方(“foo.com”是接受与 周围的应用程序):

我的控制器.java

@Autowired
private OAuth2RestOperations restTemplate;

@RequestMapping("/relay")
public String relay() {
ResponseEntity<String> response =
restTemplate.getForEntity("https://foo.com/bar", String.class);
return "Success! (" + response.getBody() + ")";
}

如果您不想转发令牌(这是一个有效的 选择,因为您可能想扮演自己,而不是 向您发送令牌的客户端),那么您只需要创建自己的令牌而不是自动连接默认令牌。​​OAuth2Context​

Feign 客户端还将选取一个拦截器,该拦截器使用 if 它可用,因此他们也应该做一个 令牌中继任何地方。​​OAuth2ClientContext​​​​RestTemplate​

配置 Zuul 代理的下游身份验证

您可以通过设置控制下游的授权行为。例:​​@EnableZuulProxy​​​​proxy.auth.*​

应用程序.yml

proxy:
auth:
routes:
customers: oauth2
stores: passthru
recommendations: none

在此示例中,“客户”服务获取 OAuth2 令牌中继, “存储”服务获取直通(授权标头为 刚刚通过下游),并且“推荐”服务有其 已删除授权标头。默认行为是执行令牌 如果有可用的令牌,则中继,否则通过。

有关完整详细信息,请参阅代理身份验证属性。