赞
踩
Spring Cloud Security提供了一组原语,用于以最少的麻烦构建安全的应用程序和服务。可以在外部(或中央)进行大量配置的声明性模型很适合于通常使用中央身份管理服务的大型协作远程组件系统的实施。在Cloud Foundry等服务平台中使用它也非常容易。在Spring Boot和Spring Security OAuth2的基础上,我们可以快速创建实现通用模式(如单点登录,令牌中继和令牌交换)的系统。
https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/docs/src/main/asciidoc/contributing-docs.adoc
快速开始
OAuth2单点登录
这是一个具有HTTP Basic身份验证和单个用户帐户的Spring Cloud“ Hello World”应用程序:
应用程序
@Grab(‘spring-boot-starter-security’)
@Controller
class Application {
@RequestMapping(’/’)
String home() {
‘Hello World’
}
}
您可以使用它运行spring run app.groovy并查看日志中的密码(用户名是“ user”)。到目前为止,这只是Spring Boot应用程序的默认设置。
这是带有OAuth2 SSO的Spring Cloud应用程序:
应用程序
@Controller
@EnableOAuth2Sso
class Application {
@RequestMapping(’/’)
String home() {
‘Hello World’
}
}
指出不同?该应用程序实际上与上一个应用程序的行为完全相同,因为它尚不知道它是OAuth2凭据。
您可以很容易地在github中注册一个应用程序,因此,如果您想在自己的域上使用生产应用程序,请尝试使用它。如果您愿意在localhost:8080上进行测试,请在应用程序配置中设置以下属性:
application.yml
spring:
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上运行时,这些凭据才有效。
要限制客户端在获取访问令牌时要求的范围,可以设置spring.oauth2.client.scope(逗号分隔或YAML中的数组)。默认情况下,作用域为空,并且由授权服务器决定默认值是什么,通常取决于它所拥有的客户端注册中的设置。
注意 上面的示例都是Groovy脚本。如果要用Java(或Groovy)编写相同的代码,
则需要将Spring Security OAuth2添加到类路径中(例如,参见此处的 示例)。
OAuth2受保护的资源
您想使用OAuth2令牌保护API资源吗?这是一个简单的示例(与上面的客户端配对):
应用程序
@Grab(‘spring-cloud-starter-security’)
@RestController
@EnableResourceServer
class Application {
@RequestMapping(’/’)
def home() {
[message: ‘Hello World’]
}
}
和
application.yml
spring:
oauth2:
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false
更多详情
单点登录
注意 所有OAuth2 SSO和资源服务器功能已在1.3版中移至Spring Boot。您可以
在Spring Boot用户指南中找到文档 。
令牌中继
令牌中继是OAuth2使用者充当客户端,并将传入令牌转发到传出资源请求的地方。使用者可以是纯客户端(如SSO应用程序)或资源服务器。
客户令牌中继
如果您的应用程序具有 Spring Cloud Zuul嵌入式反向代理(使用@EnableZuulProxy),则可以要求它向下游转发OAuth2访问令牌到它正在代理的服务。因此,可以像下面这样简单地增强上面的SSO应用程序:
应用程序
@Controller
@EnableOAuth2Sso
@EnableZuulProxy
class Application {
}
它将(除了登录用户并获取令牌外)还将身份验证令牌传递到/proxy/* 服务下游。如果使用这些服务实现,@EnableOAuth2Resource则它们将在正确的标头中获得有效的令牌。
它是如何工作的?将@EnableOAuth2Sso在注释拉 spring-cloud-starter-security(你可以做手工在传统的应用程序),而这又引发了一些自动配置的ZuulFilter,其本身被激活,因为Zuul是在类路径中(通过@EnableZuulProxy)。{github} /tree/master/src/main/java/org/springframework/cloud/security/oauth2/proxy/OAuth2TokenRelayFilter.java [filter]只是从当前经过身份验证的用户中提取访问令牌,并将其放入请求中下游请求的标头。
资源服务器令牌中继
如果您的应用同时具有@EnableOAuth2Resource并且也是客户端(即spring.oauth2.client.clientId,即使不使用它也具有),那么 Spring Cloud OAuth2RestOperations为@Autowired用户提供的(也被声明为@Primary)也将转发令牌。如果您不希望转发令牌(这是一个正确的选择,因为您可能想扮演自己的角色,而不是发送令牌的客户端),那么您只需要创建自己的令牌, OAuth2RestOperations而不是自动装配默认值一。这是一个显示自动装配的休息模板的使用的基本示例(“ foo.com”是一台与周围应用程序接受相同令牌的资源服务器):
MyController.java
@Autowired
private OAuth2RestOperations restTemplate;
@RequestMapping("/relay")
public String relay() {
ResponseEntity response =
restTemplate.getForEntity(“https://foo.com/bar”, String.class);
return “Success! (” + response.getBody() + “)”;
}
配置Zuul代理的下游身份验证
您可以@EnableZuulProxy通过proxy.auth.*设置控制授权行为的下游 。例:
application.yml
proxy:
auth:
routes:
customers: oauth2
stores: passthru
recommendations: none
在此示例中,“客户”服务获取OAuth2令牌中继,“商店”服务获取直通(授权标头仅向下游传递),“推荐”服务删除其授权标头。默认行为是在有令牌可用时进行令牌中继,否则通过。
有关完整的详细信息,请参见{github} / tree / master / src / main / java / org / springframework / cloud / security / oauth2 / proxy / ProxyAuthenticationProperties [ProxyAuthenticationProperties]。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。