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 使用内存中数据存储。如果需要更强大的解决方案,则需要提供自己的实现。 |
客户端令牌中继
如果您的应用程序是面向 OAuth2 客户端的用户(即具有声明者),那么它具有来自 Spring Boot 的请求范围。您可以 从此上下文创建自己的上下文和 自动连线,然后上下文将 始终将访问令牌转发到下游,同时刷新访问 令牌在过期时自动。(这些是春天的特点 安全性和春季启动。@EnableOAuth2Sso
@EnableOAuth2Client
OAuth2ClientContext
OAuth2RestTemplate
OAuth2ProtectedResourceDetails
Spring 引导 (1.4.1) 不会自动创建,如果你正在使用令牌。在这种情况下,您需要创建自己的并对其进行配置。 |
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刷新令牌。 |
资源服务器令牌中继
如果您的应用程序有您可能想要中继 传入令牌下游到其他服务。如果您使用 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 令牌中继, “存储”服务获取直通(授权标头为 刚刚通过下游),并且“推荐”服务有其 已删除授权标头。默认行为是执行令牌 如果有可用的令牌,则中继,否则通过。
有关完整详细信息,请参阅代理身份验证属性。
标签:令牌,OAuth2,Spring,身份验证,应用程序,Security,Cloud,客户端 From: https://blog.51cto.com/u_15326439/5906974