点击蓝色“程序猿DD”关注我哟

来源:SpringForAll社区

序言

安全性是暴露由许多微服务组成的公共访问API时要考虑的最重要的一个方面。Spring有一些有趣的功能和框架,使我们的微服务安全配置更容易。在本文中,我将向您展示如何使用Spring Cloud和Oauth2在API网关后面提供令牌访问安全性。

理论知识

OAuth2标准目前被所有主要网站使用并且允许通过共享API访问其资源。它是一种开放式授权标准,允许用户将存储在一个页面中的私有资源共享到另一个页面,而无需进入其凭据服务。这些是与oauth2相关的基本术语。

  • Resource Owner – 处理对资源的访问

  • Resource Server – 存储可以使用特殊令牌共享的所有者资源的服务器

  • Authorization Server – 管理密钥,令牌和其他临时资源访问代码的分配。它还必须确保授予相关人员访问权限

  • Access Token – 允许访问资源的密钥

  • Authorization Grant – 授予访问权限。有多种方法可以确认访问权限:授权代码,隐式,资源所有者密码凭据和客户端凭据

您可以在此处以及在digitalocean文章中阅读有关此标准的更多信息。该协议的流程主要有三个步骤。首先,我们将授权请求发送给资源所有者。在资源所有者响应后,我们向授权服务器发送授权请求并接收访问令牌。最后,我们将此访问令牌发送到资源服务器,如果它有效,则API将资源提供给应用程序。

方案

下图显示了我们案例的架构。我们用API网关(Zuul)代理我们对授权服务器的请求和两个帐户微服务实例。授权服务器是某种提供outh2安全机制的基础结构服务。我们还有发现服务(Eureka),我们所有的微服务都已注册。

网关

对于我们的示例,我们不会在API网关上提供任何安全性。它只需要将客户端的请求代理到授权服务器和帐户微服务。在下面可见的Zuul的网关配置中,我们将sensitiveHeaders属性设为空值以启用授权HTTP头转发。默认情况下,Zuul在将我们的请求转发到目标API时切断了该头,这是不正确的,因为网关后面的服务需要基本授权。

  1. zuul:

  2. routes:

  3. uaa:

  4. path: /uaa/**

  5. sensitiveHeaders:

  6. serviceId: auth-server

  7. account:

  8. path: /account/**

  9. sensitiveHeaders:

  10. serviceId: account-service

网关源代码中的主类非常简单。它只需要启用Zuul代理功能和发现客户端来收集Eureka注册表中的服务。

  1. @SpringBootApplication

  2. @EnableZuulProxy

  3. @EnableDiscoveryClient

  4. public class GatewayServer {

  5. public static void main(String[] args) {

  6. SpringApplication.run(GatewayServer.class, args);

  7. }

  8. }

授权服务器

gaOur授权服务器内的主类也很简单。它基于默认的Spring安全配置。客户端授权详细信息存储在内存存储库中。当然在生产模式中,您也可以使用其他实现而不是内存存储库,如JDBC数据源和令牌存储。您可以在Spring Security Reference和Spring Boot Security中阅读有关Spring授权机制的更多信息。这是application.yml的配置片段。我们为/ token端点提供了用户基本身份验证数据和基本安全凭证:client-id和client-secret。用户凭据是普通的Spring Security用户详细信息。

  1. security:

  2. user:

  3. name: root

  4. password: password

  5. oauth2:

  6. client:

  7. client-id: acme

  8. client-secret: secret

这是用@EnableAuthorizationServer实现身份验证服务器的主要类。我们公开一个REST端点验证帐户服务的用户身份详情,并为客户端启用了Eureka注册和发现。

  1. @SpringBootApplication

  2. @EnableAuthorizationServer

  3. @EnableDiscoveryClient

  4. @EnableResourceServer

  5. @RestController

  6. public class AuthServer {

  7. public static void main(String[] args) {

  8. SpringApplication.run(AuthServer.class, args);

  9. }

  10. @RequestMapping("/user")

  11. public Principal user(Principal user) {

  12. return user;

  13. }

  14. }

Application-账户微服务

我们的示例微服务只有一个@GET请求的端点,它始终返回相同的帐户。在主类中,资源服务和Eureka发现都已启用。服务配置很简单。 GitHub上提供了示例应用程序源代码。

  1. @SpringBootApplication

  2. @EnableDiscoveryClient

  3. @EnableResourceServer

  4. public class AccountService {

  5. public static void main(String[] args) {

  6. SpringApplication.run(AccountService.class, args);

  7. }

  8. }

  9. security:

  10. user:

  11. name: root

  12. password: password

  13. oauth2:

  14. resource:

  15. loadBalanced: true

  16. userInfoUri: http://localhost:9999/user

测试

我们只需要Web浏览器和REST客户端(例如Chrome Advanced REST客户端)来测试我们的解决方案。从向资源所有者发送授权请求开始测试。我们可以通过Web浏览器中的Zuul网关调用oauth2授权端点。

http://localhost:8765/uaa/oauth/authorize?response_type=token&client_id=acme&redirect_uri=http://example.com&scope=openid&state=48532

发送请求后,我们应该看到下面的页面。选择“Approve”,然后单击“Authorize”,从授权服务器请求访问令牌。如果应用程序标识已通过身份验证且授权授予有效,则应在HTTP响应中返回应用程序的访问标记。

http://example.com/#access_token=b1acaa35-1ebd-4995-987d-56ee1c0619e5&token_type=bearer&state=48532&expires_in=43199

最后一步是使用访问令牌调用帐户端点。我们不得不将其作为承载令牌放入Authorization标头中。在示例应用程序中,安全操作的日志记录级别设置为TRACE,因此您可以轻松找出问题发生时的情况。

结束语

说实话,我不太熟悉应用程序中的安全问题。所以对我来说一个非常重要的是使用的安全解决方案的简单性。在Spring Security中,我们几乎所有需要的机制都是开箱即用的。它还提供可轻松扩展的组件,以满足更高级的要求。您应该将本文视为使用Spring Cloud和Spring Security项目的更高级解决方案的简要介绍。

原文链接:https://piotrminkowski.wordpress.com/2017/02/22/microservices-security-with-oauth2/

作者:Piotr Mińkowski

译者:Emma

号外:最近整理了之前编写的一系列内容做成了PDF,关注我并回复相应口令获取:

001 :领取《Spring Boot基础教程》

- 002 :领取《Spring Cloud基础教程》

更多内容陆续奉上,敬请期待 

- END -

 近期热文:

  • 为什么美国程序员工作比中国程序员工作轻松、加班少?

  • Spring Cloud Alibaba 基础教程整理

  • 我为啥不看好ServiceMesh

  • 敏捷团队的病与药

  • 分布式系统关注点:弹性架构

  • GitHub 寻宝指南

  • 虎牙直播在微服务改造方面的实践和总结

  • 有赞搜索系统的架构演进

  • 在前后端分离的路上承受了多少痛?

  • 中台是个什么鬼?

2019

与大家聊聊技术人的斜杠生活

看完,赶紧点个“好看”鸭

点鸭点鸭

↓↓↓↓

使用Oauth2实现微服务的安全保护相关推荐

  1. Spring Cloud OAuth2 JWT 微服务认证服务器得构建

    文章目录 Spring Cloud OAuth2 JWT 微服务认证服务器得构建 前言 认证服务得搭建 `AuthorizationServer` `WebSecurityConfig` `Autho ...

  2. 十七.SpringCloud+Security+Oauth2实现微服务授权 -非对称加密生成JWT令牌

    仅做学习使用,老鸟飞过,欢迎交流 前言 在之前的微服务授权方案<SpringCloud+Security+Oauth2实现微服务授权 - 授权服务配置>中我们使用的是Oauth+JWT方式 ...

  3. 【微服务】微服务安全 - 如何保护您的微服务基础架构?

    在当今行业使用各种软件架构和应用程序的市场中,几乎不可能感觉到您的数据是完全安全的.因此,在使用微服务架构构建应用程序时,安全问题变得更加重要,因为各个服务相互之间以及客户端之间进行通信.因此,在这篇 ...

  4. 十一.SpringCloud+Security+Oauth2实现微服务授权 - 授权服务配置

    前言 上一文章我们准备了微服务授权的环境,并对AuthServer实现了简单的认证流程,这里是接上一篇文章继续对AuthServer认证服务做Oauth2配置 1.概述Oauth2授权服务配置 我们只 ...

  5. 告别“臃肿”,选择微服务(文末福利)

    点击标题下「异步社区」可快速关注 参与文末话题讨论,每周赠送异步图书 --异步小编 一直以来,系统的架构设计是IT领域经久不衰的话题,也是构建每一个系统最核心且重要的部分之一.它决定了系统能否满足业务 ...

  6. [转载] 微服务安全和治理

    参考链接: 微服务介绍 在整体式架构中,由于运行应用程序的运行时环境相对隔离,所以治理和安全保护很简单.微服务架构具有典型的革新特征,给活动的治理和应用程序的安全威胁保护带来了更多挑战.  微服务架构 ...

  7. 基于Spring Cloud的微服务架构

    关于基于Spring Cloud的微服务应用架构,网上已经有很多文章了,但我还是觉得把自己的架构过程和经验写下来,对自己来说算是知识和技术的梳理,对于误打误撞进来看到这篇文章的读者来说,或许也能起到一 ...

  8. Istio:一个用于微服务间通信的服务网格开源项目

    http://www.infoq.com/cn/news/2017/05/istio Istio:一个用于微服务间通信的服务网格开源项目 Google.IBM和Lyft开源了微服务管理.保护和监控框架 ...

  9. golang微服务框架对比_Go语言开发的微服务框架,你了解多少?

    Go语言开发的微服务框架 1.项目名称:Istio 项目简介:Istio是由Google.IBM和Lyft开源的微服务管理.保护和监控框架.使用istio可以很简单的创建具有负载均衡.服务间认证.监控 ...

最新文章

  1. CentOS中vsftp安装与配置
  2. 大道至简:软件工程实践者的思想——第七、八章感想
  3. 【查看Linux带宽】nload、iptraf 的安装与使用
  4. 2019蓝桥杯省赛---java---C---4(质数)
  5. linux系统的4个部分,以下是Linux文件系统的4个相关的结构定义中的一部分: Struct i..._考试资料网...
  6. centos7安装svn客户端和使用
  7. TCP和UDP Socket
  8. MySQL数据库环境变量设置
  9. 惠普电脑怎么用access_惠普笔记本电脑怎么分区
  10. 威纶触摸屏485通信控制多台台达变频器程序
  11. 联通云OSS上传文件
  12. 打造淘宝极简包的轻量化框架
  13. 友盟QQ第三方登录分享
  14. JavaScript弹出框、对话框、提示框、弹窗总结
  15. requests.get
  16. 怎么样成为一名Python工程师?到底要会哪些东西?你会了多少?
  17. 直流亥姆霍兹线圈和交流亥姆霍兹线圈的区别
  18. git 撤回 (git版本回退处理)
  19. 大前端课程 - 4.5个月学习总结
  20. 计算机基础知识 JAVA基础知识

热门文章

  1. linux 内存管理中的 rss 和 vsz
  2. linux gzip 命令简介
  3. linux docker 与 iptables 的关系
  4. linux 内核 struct file 获取文件名 全路径
  5. Android--实现自制录音/播放录音程序
  6. (三)Amazon Lightsail 部署LAMP应用程序之连接到Lightsail数据库
  7. Linux基本命令之ls
  8. mysql定制化_【MySQL技巧】定制你的MySQL命令行-阿里云开发者社区
  9. Windows - Windows批处理
  10. Linux 系统调用(二)——使用内核模块添加系统调用(无需编译内核)