Spring Cloud Security

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Security相关的知识,希望对你有一定的参考价值。

Spring

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 令牌中继, “存储”服务获取直通(授权标头为 刚刚通过下游),并且“推荐”服务有其 已删除授权标头。默认行为是执行令牌 如果有可用的令牌,则中继,否则通过。

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

以上是关于Spring Cloud Security的主要内容,如果未能解决你的问题,请参考以下文章

关于Spring Cloud Gateway与下游服务器的连接分析

Spring Cloud Security[微服务安全](一)初识Spring Cloud Security和OAuth2.0

Spring Cloud 值Spring-Security

Spring cloud eureka 添加 spring-security

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

Spring starter security or spring cloud security 如何保护整个微服务架构?