文档章节

Spring Cloud:Eureka,Zuul和OAuth2 - 扩展授权服务器

爱兔一生
 爱兔一生
发布于 2017/03/12 17:52
字数 1222
阅读 12149
收藏 8

    我们将在这里讨论一个非常实际的问题,扩展Spring OAuth2授权服务器,并更详细地描述如何使用Spring Cloud本身完成这一任务。您的授权服务器可能在单个请求处理期间被多次请求,因此您希望它能够匹配需求。 当我第一次处理这个问题时,我没有完全理解Spring Cloud提供了哪些功能,并做了一些错误的假设,所以它可能值得描述如何做一个基本的设置,发生在底下发生什么和你可能期望。

    在Spring OAuth2.0.x中,有三个非常有用的注释,可以在应用程序中启用不同的功能:

  • @EnableOAuth2Resource
  • @EnableOAuth2Sso
  • @EnableOAuth2Client

    我想更详细地介绍前两个。

    对于每个注释,都有一个必须指定的对应属性。验证令牌并检索用户信息所需的最小资源服务器配置是指定userInfoUri属性。

spring:
  oauth2:
    resource:
      userInfoUri: http://localhost:9999/uaa/user

    这将允许使用Barer令牌认证来验证传入的请求。    

    所以很可能你打算启用资源服务器可能每个微服务,你要开发。在其中一个边缘服务上,您可能需要启用单点登录。 @EnableOAuthSso将允许您将未经认证的用户的自动重定向转向授权服务器,他们将能够登录。

    类似地,您将必须指定一些额外的属性,如授权服务器令牌的地址和授权uri以及客户端凭据。我们还可以指定我们的应用程序中应该保护哪些路径。

  

spring:
  oauth2:
    sso:
      home:
        secure: true
        path: /,/**/*.html
    client:
      accessTokenUri: http://localhost:9999/uaa/oauth/token
      userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
      clientId: edge
      clientSecret: secret

    现在这是一个在单个节点上工作的最小设置(当然,您可以将授权服务器放在任何负载均衡器之后)。

    这不是全部,如果你导入spring-cloud-security模块(版本至少1.0.2)。在每个资源服务器上,自动配置类将设置OAuth2RestTemplate,这将传播身份验证令牌,如果您碰巧启用了发现客户端(通过导入Eureka客户端或Consul并正确设置它),它也将能够发现和将负载分配给注册服务。

    也可以通过自定义扩展为Feign客户端实现相同的功能。

    最后,如果将spring.oauth2.resource.loadBalanced设置为true,您将配置客户端负载平衡以从授权服务器检索用户信息(当您运行多个节点并在发现服务中注册它们时):

spring:
  oauth2:
    resource:
      loadBalanced: true
      userInfoUri: http://oauth2/uaa/user

    这个功能没有特别记录,我偶然发现它通过Spring云安全源代码。

    这已经很整洁,但是我们的单点登录怎么办?此刻,我们必须指定一个单一的地址。

    在我一直在努力的项目中,我们以两种不同的方式在两个不同的配置中解决了这个问题。在一个单页应用程序的应用程序之一,我们完全从服务器端重定向的构建中取消了,并使用AngularJS和简单的AJAX POST进行身份验证。为了工作,我们不得不启用CORS(授权服务器不做,但你可以找到一个有趣的文章如何做到这一点)或配置一个反向代理 - 如Zuul。我们选择了后者。通过简单的设置,您可以通过Zuul将授权AJAX请求路由到授权服务器:

zuul:
  ignoredServices: '*'
  routes:
    oauth2:
      path: /uaa/**
      serviceId: oauth2
      stripPrefix: false

    最后,如果要使用Spring的单点登录,您可以通过设置Zuul代理作为您的边缘网关,并正确配置到自动发现的节点的路由,用edge网关地址替换accessTokenUri和userAuthorizationUri(最好是DNS名称)。当然,没有任何理由不使用任何其他负载均衡器,特别是如果你的云提供商提供一个开箱。虽然在Zuul代理自动发现的构建是非常诱人的在这里使用。

    总而言之,对于您的“内部”通信,资源服务器可以在发现服务的帮助下使用Spring Cloud负载平衡支持中的构建。当“外部”世界需要与您的OAuth2服务器通信时,您应该在其前面放置负载均衡器,Netflix Zuul是自然的候选人,同时解决方案可以跨不同的云提供商以及容器,如Docker。

    通过这样的设置,您现在可以添加任意数量的授权服务器节点。

© 著作权归作者所有

爱兔一生
粉丝 12
博文 18
码字总数 11362
作品 0
常州
高级程序员
私信 提问
加载中

评论(8)

霏微
霏微
3Q
爱兔一生
爱兔一生

引用来自“霏微”的评论

你好,我有个问题想请教下你。我查找了oauth2的原理,但没有找到资源服务器是怎么校验token的,这点让我感到疑惑,能方便解答吗?另外,如果是采用向授权服务器发送token进行验证,那么当采用jwt的时候也是如此吗?还是说资源服务器自行校验呢?
spring oauth2 有个check token的endpoint /check_token?token=xxxxx. 详见 spring-security-oauth2.jar中的CheckTokenEndpoint类
霏微
霏微
你好,我有个问题想请教下你。我查找了oauth2的原理,但没有找到资源服务器是怎么校验token的,这点让我感到疑惑,能方便解答吗?另外,如果是采用向授权服务器发送token进行验证,那么当采用jwt的时候也是如此吗?还是说资源服务器自行校验呢?
安静听歌
安静听歌
,,,怎么感觉语句不通顺啊,,,
爱兔一生
爱兔一生

引用来自“1038612693”的评论

楼主有没有demo啊 想参考下 非常感谢
https://git.oschina.net/zhmlvft/base-demo
1
1038612693
楼主有没有demo啊 想参考下 非常感谢
爱兔一生
爱兔一生

引用来自“Nathans”的评论

楼主环境搭建好了吗?我们现在也需要基于OAuth2.0搭建
遇到什么问题?
Nathans
Nathans
楼主环境搭建好了吗?我们现在也需要基于OAuth2.0搭建
spring cloud oauth2 token获取后访问资源服务器出现:Full authentication is required to access this resource

spring cloud oauth2 token获取后通过zuul网关访问资源服务器出现:{ "error": "unauthorized", "error_description": "Full authentication is required to access this resource" },求大神......

伊正
2018/12/27
0
0
Spring Cloud 1.0.0.RC1 发布

Spring Cloud 1.0.0.RC1 发布,此版本现已提供在 http://repo.spring.io 和 Maven 库。 值得关注的新特性如下: 通过一个注解 和 支持 Hystrix 指标聚合 (for an AMQP-based collector) 新增...

oschina
2014/12/20
2.3K
1
Spring Cloud 安全:集成OAuth2实现身份认证和单点登录

1、概述 Spring Cloud 的安全模块可以为Spring Boot应用提供基于令牌的安全特性。具体讲就是支持OAuth2协议来实现单点登录(SSO),可以很方便地在资源服务之间传递身份令牌,以及使用嵌入式...

RaiseHead
2018/07/20
0
0
想飞の猫/FCat

FCat 全栈必备 FCat是基于Angular4+SpringCloud的企业级基础功能框架(户权限管理、区域管理、GIS地图、......),其核心设计目标是分离前后端、开发快速、学习简单、功能强大、不重复造轮子,...

想飞の猫
2017/10/18
0
0
如何将 Spring Cloud Netflix 框架集成到现有 API 中

当前,RESTful API可能已经在你所在的组织中达到了某种程度的成功。当越来越多的微服务或API涌现出来时,API间的依赖也随之增长,对服务的要求也更多的落在了提供尽可能稳定的API或微服务。通...

oschina
2016/11/08
3.3K
6

没有更多内容

加载失败,请刷新页面

加载更多

在Javascript中Eval函数的使用

【eval()函数】 JavaScript有许多小窍门来使编程更加容易。 其中之一就是eval()函数,这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。 举个小例子: var the_unevaled_ans...

花漾年华
10分钟前
1
0
[日更-2019.5.22、23] Android 系统的分区和文件系统(二)--Android 文件系统中的文件

声明 Android系统中有很多分区,每个分区内的文件系统一般都不同的,使用ADB进入系统/目录下可发现挂载这很多的目录,不同的目录中可来自不同的分区及文件系统; 那么,就来分下这些目录里面...

小馬佩德罗
15分钟前
2
0
数组操作相关算法

/*数组的相关的算法操作:1、在数组中找最大值/最小值*/class Test11_FindMax{public static void main(String[] args){int[] array = {4,2,6,8,1};//在数组中找最大...

architect刘源源
今天
2
0
okhttp3 以上版本在安卓9.0无法请求数据的解决方案

应用官方的说明:在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。且Android P 限制了明文流量...

chenhongjiang
今天
12
0
简单示例:NodeJs连接mysql数据库

开篇引用网上的说法: 简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于...

李朝强
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部