文档章节

spring cloud微服务架构之UAA

丁丙乙甲
 丁丙乙甲
发布于 2017/03/25 23:57
字数 917
阅读 1683
收藏 14

微服务中,对用户及其权限的管理,具体实现的方式有很多种,从架构上来看分为:

  1. 网关层进行权限管理 <本文的实现方式>
  2. 各服务独立实现校验;
  3. 校验逻辑实现在各服务上,通过共享数据或者授权中心等方式实现;

本文源码: 码云传送门

授权流程图示1:

UAA授权

校验流程图示2:

校验流程图示2

实例演示

git clone https://git.oschina.net/zhangfeng0103/springcloud-microservices-examples
cd springcloud-microservices-examples
mvn clean package

####启动本次重要的三个服务

java -Dfile.encoding=UTF-8 -jar eureka-server\target\eureka-server-1.0.0.jar
java -Dfile.encoding=UTF-8 -jar gateway\target\gateway-1.0.0.jar
java -Dfile.encoding=UTF-8 -jar uaa-service\target\uaa-service-1.0.0.jar

####测试一把(windows)

# 项目中UAA已经默认有两个用户,且有对应的权限。参考resource目录下import.sql
# 用户10086,获取token
C:\Users\zhangfeng>curl "http://localhost:8765/uaa-token/token/byPhone" -H "Content-Type: application/json" --data-binary "{\"phone\":\"10086\",\"password\":\"123\"}" --compressed
{"accessToken":"eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eNpUjsEOgjAQRP-lR2KlYCmFk1_gDxgP23aRohRiwZgY_90NEo3HmXk7O0_mY2Q1mwHYhnmYWJ3JSshCCS03DGZHYSZERmk3eRLOqMLtSuRNnisuoSq5lqLk0lS6AKMcuoLgOeLtAD3SRQf2Qg4-xrVc6aUce_DXtX5PA7Z26Ikb2yHgx9aKdJzNb0Mwzf_CaIeR6CNLh2hbHyBNEuLSqUVOE-7e4urQh6_TQ4DzEpxebwAAAP__.JXorfMhakvVMcfW8m35d9RWv5TEiGKUjZipDXRl9lm9C-EF2UZIO7iGR9XRu6s5axnKM29b4Kvml8PiL984E9w"}

# 调用接口 解析token可以显示的看到相应的用户信息及scope
C:\Users\zhangfeng>curl "http://localhost:8765/uaa-token/token/parse?token=eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eNpUjsEOgjAQRP-lR2KlYCmFk1_gDxgP23aRohRiwZgY_90NEo3HmXk7O0_mY2Q1mwHYhnmYWJ3JSshCCS03DGZHYSZERmk3eRLOqMLtSuRNnisuoSq5lqLk0lS6AKMcuoLgOeLtAD3SRQf2Qg4-xrVc6aUce_DXtX5PA7Z26Ikb2yHgx9aKdJzNb0Mwzf_CaIeR6CNLh2hbHyBNEuLSqUVOE-7e4urQh6_TQ4DzEpxebwAAAP__.JXorfMhakvVMcfW8m35d9RWv5TEiGKUjZipDXRl9lm9C-EF2UZIO7iGR9XRu6s5axnKM29b4Kvml8PiL984E9w" -H "Content-Type: application/json"  --compressed
{"iss":"uaa","iat":1490456084,"aud":"1001","jti":"db65d37e-f226-4a97-8407-4b985ab6ded5","userName":"jack","exp":1490468084,"email":"1001@uaa.com","phone":"10086","sub":"1001","nbf":1490456084,"scope":["/oschina/**","/the-service/**","/uaa-service/manage/**"]}
# 尝试调用查看用户信息的接口
C:\Users\zhangfeng>curl "http://localhost:8765/uaa-service/manage/users/1001" -H "Authorization:eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eNpUjsEOgjAQRP-lR2KlYCmFk1_gDxgP23aRohRiwZgY_90NEo3HmXk7O0_mY2Q1mwHYhnmYWJ3JSshCCS03DGZHYSZERmk3eRLOqMLtSuRNnisuoSq5lqLk0lS6AKMcuoLgOeLtAD3SRQf2Qg4-xrVc6aUce_DXtX5PA7Z26Ikb2yHgx9aKdJzNb0Mwzf_CaIeR6CNLh2hbHyBNEuLSqUVOE-7e4urQh6_TQ4DzEpxebwAAAP__.JXorfMhakvVMcfW8m35d9RWv5TEiGKUjZipDXRl9lm9C-EF2UZIO7iGR9XRu6s5axnKM29b4Kvml8PiL984E9w" -H "Content-Type: application/json" --compressed
{
  "phone" : "10086",
  "userName" : "jack",
  "password" : "123",
  "email" : "1001@uaa.com",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8765/uaa-service/manage/users/1001"
    },
    "user" : {
      "href" : "http://localhost:8765/uaa-service/manage/users/1001"
    }
  }
}
# OK,调用顺利
# 切换用户10087
# .. .省略获取token的步骤,直接尝试调用接口
# cmd窗口有乱码,特意加了-w \nhttpstatus:%{http_code},可以看到,服务器响应的状态码为403
C:\Users\zhangfeng>curl "http://localhost:8765/uaa-service/manage/users/1001" -H "Authorization:eyJhbGciOiJIUzUxMiIsInppcCI6IkRFRiJ9.eNpUjk0KwjAQhe8yy9LYtE3TpCtP4AXExaSJGLE_mAYE8RZeQnDlpcRbOGhBXL73vnnzzuBDgAYiIqTgcYImF5qLSpaKp4DRUphzXlC6nzwJjbUpt9oxmaNiwhbIlCoLxp3AykpZayUIjsEdV9g5unjd7s_rgzx3Gud6qT71rkN_mB8sacKiHTrixt3Qu6-tatIhmt-K3mz_N4Z2GIleQ2bQ25glCWwubwAAAP__.gDIC1foN5yUpFbJ7zC-v0Q3Y4jTu8I5L4_ewvu7dPggXmZIwzucAgsj1RzcObPLF8I0dWwMPYUiALJlfiut_uQ" -H "Content-Type: application/json" --compressed -w \nhttpstatus:%{http_code}

{"content":"鏃犺闂潈闄?,"result":false}httpstatus:403

划重点:

# gateway config网关相关的配置
gateway:
  token:
    jwt:
       key: xxxxxsthis       # 与uaa中的key保持一致
  filter:
    noAuthenticationUrls:    #此处代码,下面这些路由 ID 不需要验权
      - gateway
      - uaa-token
    errorMessage:            #这是异常处理,code与异常描述的对应关系维护
      999: 系统异常
      403: 无访问权限
      500: 服务器错误

QA:

1、token已经发出去,该账户的权限发生了更新,怎么办?

  • a方法. 首先说一下托底的方案,token超过有效期就不能使用,这也就意味着,最后一批发放的token有效期过了以后,权限更新会应用到所有账户上。这种方式满足一部分平台的需要。

  • b方法. UAA通知网关,指定时间之前的token都无效,网关只需在token校验中加上对应的逻辑即可,具体实现上可轮询,可推送。(有点像我们的身份证,中央告知各级单位,某日开始一代身份证无法办理业务…)

2、 即将过期的token怎么刷新?

  • 在网关验权过程中,发现即将过期的token,可在response header打入相应的标签,客户端发现有这个标签,调用刷新token的服务,重新获取一次即可。

本文参考了jhipsterCloudFoundry对UAA的实现。

大家有其他思路的话,希望能留言分享.

© 著作权归作者所有

丁丙乙甲
粉丝 26
博文 4
码字总数 4361
作品 0
闵行
其他
私信 提问
关于Spring Cloud的核心特性

SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别; 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个...

itcloud
2018/05/23
68
0
Spring Cloud(一) 服务的注册与发现(Eureka)

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状...

lemonLove
2018/08/11
173
0
放弃 Dubbo,选择最流行的 Spring Cloud 微服务架构实践与经验总结

前言 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的。从最初的开源软件云收藏来熟悉 Spring Boot,到项目中的慢慢使用,再到最后全面拥抱 Spring Cloud。 这篇文章给...

Java微服务
01/08
0
0
Spring Cloud Alibaba,中国 Javaer 的福音,为微服务续上 18 年

Java 界最近发生了一件大事,Spring Cloud 官方宣布阿里开源 Spring Cloud Alibaba,并推出首个预览版。 据介绍,Spring Cloud Alibaba 由阿里开源组件和阿里云产品组件两部分组成,其致力于...

h4cd
2018/11/22
12.6K
41
Spring Cloud的核心特性

SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别; 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个...

it芒果
2018/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

读书笔记:深入理解ES6 (五)

第五章 解构:使数据访问更便捷 第1节 为什么使用解构功能?   在ES5中,开发者们从对象、数组中获取特定数据并赋值给变量,编写了很多看起来同质化的代码。例如: 1 let options = {2 ...

张森ZS
24分钟前
19
0
CentOS7 yum方式安装MySQL5.7

在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1 下载并安装MySQL官方的 Yum Repository [root@localho...

roockee
32分钟前
14
0
Allegro三种自定义设置快捷键的方法

Allegro自定义设置快捷键的三种方法: 1、在Allegro PCB editor 命令窗口直接定义 2、通过修改用户变量env文件来设置快捷键 3、定义笔画为快捷键 1、在Allegro PCB editor 命令窗口直接定义 ...

demyar
37分钟前
16
0
如何做一张能让人眼前一亮的大屏?

作为在职场驰骋的社会人,提到数据可视化大家应该都不陌生了。数据可视化的作用也不用我多说,主要是利用图形化手段,更清晰直观地将数据展示。多层次、交互式的可视化分析能够方便决策者理解...

朕想上头条
37分钟前
9
0
TL138/1808/6748-EthEVM开发板硬件CPU、FLASH、RAM

TL138/1808/6748-EthEVM是广州创龙基于SOM-TL138/1808/6748核心板开发的一款开发板,具有三个网络接口。由于SOM-TL138/1808/6748核心板管脚兼容,所以此三个核心板共用同一个底板。开发板采用...

Tronlong创龙
42分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部