前言微服务架构下统?认证思路主要有两种形式:
1、基于 Session 的认证?式在分布式的环境下,基于 session 的认证会出现?个问题,每个应?服务都需要在session中存储?户身份信息,通过负载均衡将本地的请求分配到另?个应?服务需要将 session 信息带过去,否则会重新认证 。我们可以使? Session 共享、Session 黏贴等?案 。Session ?案也有缺点,?如基于 cookie,移动端不能有效使?等
2、基于 token 的认证?式 。基于token的认证?式,服务端不?存储认证数据,易维护扩展性强,客户端可以把token 存在任意地?,并且可以实现 web 和 App 统?认证机制 。其缺点也很明显,token 由于?包含信息,因此?般数据量较?,?且每次请求 都需要传递,因此?较占带宽 。另外,token 的签名验签操作也会给 cpu 带来额外的处理负担 。
下面我们就基于 token 的认证?式 。采用 OAuth2 框架来实现 。
OAuth2 开放授权协议/标准OAuth(开放授权)是?个开放协议/标准,允许?户授权第三?应?访问他们存储在另外的服务提供者上的信息,?不需要将?户名和密码提供给第三?应?或分享他们数据的所有内容 。允许?户授权第三?应?访问他们存储在另外的服务提供者上的信息,?不需要将?户名和密码提供给第三?应?或分享他们数据的所有内容 。
OAuth2 协议流程图如下:
文章插图
1、客户端请求用户授权
2、用户确认授权
3、客户端收到授权许可后,向认证服务器申请令牌
4、认证服务器验证授权许可,向客户端返回有效令牌
【OAuth2+JWT 实现权限验证】5、客户端携带有效令牌访问资源服务器
6、资源服务器从认证服务器中验证有效令牌 。
7、验证通过后,返回对应的资源给客户端 。
什么情况下需要使? OAuth2 ?第三?授权登录的场景:?如,我们经常登录?些?站或者应?的时候,可以选择使?第三?授权登录的?式,?如:微信授权登录、QQ授权登录、微博授权登录等,这是典型的 OAuth2 使?场景 。单点登录的场景:如果项?中有很多微服务或者公司内部有很多服务,可以专?做?个认证中?(充当认证平台??),所有的服务都要到这个认证中?做认证,只做?次登录,就可以在多个授权范围内的服务中?由串? 。
Spring Cloud OAuth2 + JWT 实现Spring Cloud OAuth2 是 Spring Cloud 体系对OAuth2协议的实现,可以?来做多个微服务的统?认证(验证身份合法性)授权(验证权限) 。通过向OAuth2服务(统?认证授权服务)发送某个类型的 grant_type 进?集中认证和授权,从?获得 access_token(访问令牌),?这个 token 是受其他微服务信任的 。
使? OAuth2 解决问题的本质是,引?了?个认证授权层,认证授权层连接了资源的拥有者,在授权层??,资源的拥有者可以给第三?应?授权去访问我们的某些受保护资源 。
搭建认证服务器创建一个新的的模块,service-oauth-hw-9900 。
依赖
pom 文件中依赖如下:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId><version>2.1.11.RELEASE</version></dependency><!--引入security对oauth2的支持--><dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId><version>2.3.4.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
配置文件server:port: 9900spring:application:name: service-oauth-hwzipkin:base-url: http://127.0.0.1:8771 # zipkin server的请求地址sender:# web 客户端将踪迹日志数据通过网络请求的方式传送到服务端,另外还有配置# kafka/rabbit 客户端将踪迹日志数据传递到mq进行中转type: websleuth:sampler:# 采样率 1 代表100%全部采集,默认0.1 代表10% 的请求踪迹数据会被采集# 生产环境下,请求量非常大,没有必要所有请求的踪迹数据都采集分析,对于网络包括server端压力都是比较大的,可以配置采样率采集一定比例的请求的踪迹数据进行分析即可probability: 1eureka:client:serviceUrl: # eureka server的路径defaultZone: http://quellanan.a:8761/eureka/,http://quellanan.b:8762/eureka/ #把 eureka 集群中的所有 url 都填写了进来,也可以只写一台,因为各个 eureka server 可以同步注册表instance:prefer-ip-address: true #使用ip注册#分布式链路追踪logging:level:org.springframework.web.servlet.DispatcherServlet: debugorg.springframework.cloud.sleuth: debug
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 不爱跳槽的程序员集中在8-17k,揭晓中国开发者的真实现状
- 堆和二叉堆的实现和特性
- 芯片加密技术是什么?如何实现芯片加密
- 开发人员如何快速定制化实现一个基于Solr的搜索引擎
- Sa-Token - 功能最全的 Java 权限认证框架
- 你的摄像头可能被入侵!教你用Python实现窃取摄像头照片
- 干货!如何实现一个分布式定时器
- 玛雅人预言2020年世界末日为什么没有实现 玛雅预言的世界末日为什么没有实现
- 三种实现VLAN间通信的方式,实现VLAN间通信
- C语言实现MD5加密,竟如此简单