1 前置条件
这章主要讲述网关gateway 整合 springsecurity,OAuth2.0 和jwt 进行权限的授权和认证,需要具备一些前置的基础
1 了解Oauth2协议及其授权模式
2 熟悉 springsecurity OAuth2.0 和 JWT的使用
3 熟悉 SpringCloud GateWay 网关使用。
这些都是都是一些基础的知识,网上资料也很多,我们一带而过,如果想要了解更多细节,欢迎留言提问。
1.1 Oauth2.0
OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。OAuth在全世界得到广泛应用,目前的版本是2.0版。
OAuth协议:
https://tools.ietf.org/html/rfc6749
协议特点:
- 简单:不管是OAuth服务提供者还是应用开发者,都很易于理解与使用;
- 安全:没有涉及到用户密钥等信息,更安全更灵活;
- 开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth;
应用场景:
- 原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、请求后台数据。
- 前后端分离单页面应用:前后端分离框架,前端请求后台数据,需要进行oauth2安全认证,比如使用vue、react后者h5开发的app
- 第三方应用授权登录,比如QQ,微博,微信的授权登录。
客户端授权模式:
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 对于如何颁发令牌的细节,规定得非常详细。具体来说,一共分成四种授权类型(authorization grant),即四种颁发令牌的方式,适用于不同的互联网场景。
- 授权码模式(authorization code)
- 密码模式(resource owner password credentials)
- 简化(隐式)模式(implicit)
- 客户端模式(client credentials)
不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。
1.2 SpringSecurity
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowed to do?,也称为Authorization)。Spring Security在架构上将认证与授权分离,并提供了扩展点。
认证(Authentication) :用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。
授权(Authorization): 授权是用户认证通过根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正常访问,没有权限则拒绝访问。
将OAuth2和Spring Security集成,就可以得到一套完整的安全解决方案。我们可以通过Spring Security OAuth2构建一个授权服务器来验证用户身份以提供access_token,并使用这个access_token来从资源服务器请求数据。
1.3 JWT
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。
JWT令牌的优点:
- jwt基于json,非常方便解析。
- 可以在令牌中自定义丰富的内容,易扩展。
- 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
- 资源服务使用JWT可不依赖授权服务即可完成授权。
缺点:
JWT令牌较长,占存储空间比较大。
1.4 Gateway
Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。
Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包
核心概念:
- 路由(route)路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。
- 断言(predicates)Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。如果断言为真,则说明请求的URL和配置的路由匹配。
- 过滤器(Filter)SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。
2 网关整合OAuthen2.0设计
网关整合 OAuth2.0 有两种思路,一种是授权服务器生成令牌, 所有请求统一在网关层验证,判断权限等操作;另一种是由各资源服务处理,网关只做请求转发。 比较常用的是第一种,把API网关作为OAuth2.0的资源服务器角色,实现接入客户端权限拦截、令牌解析并转发当前登录用户信息给微服务,这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了。
网关在认证授权体系里主要负责两件事:
- 作为OAuth2.0的资源服务器角色,实现接入方访问权限拦截。
- 令牌解析并转发当前登录用户信息(明文token)给微服务微服务拿到明文token(明文token中包含登录用户的身份和权限信息)后也需要做两件事:
1 用户授权拦截(看当前用户是否有权访问该资源)
2 将用户信息存储进当前线程上下文(有利于后续业务逻辑随时获取当前用户信息)
3 认证授权中心搭建
3.1 搭建的项目
- ymb-gateway 微服务网关
- ymb-authcenter 认证中心
- ymb-member 用户中心
3.2 认证中心 ymb-authcenter
pom 引用
yml 配置
配置授权服务器
在oauth_client_details中添加第三方客户端信息(client_id client_secret scope等等)
配置 springsecurity
3.3 搭建网关服务
pom.xml
网关配置
认证过滤器配置 : 过滤不需要校验的url,校验token的合法性,将token信息解析放入到上下文中,转发到对应的服务
3.4 用户中心
pom.xml
登录接口
4 认证授权中心测试
我们使用Oauth2.0 中的密码模式,以用户登录的例子进行实战分析,其他模式可以自学,也可找我要资料。
我们按照上述的模型,进行授权认证的测试
1 访问登录接口,不带用户名密码
会直接提示,验证失败
2 访问用登录接口,带上用户名密码
登录的时候访问认证服务器,获取token
这样我们就获取到access_token 了,后面请求其他的接口,只需要带着 beartoken 就可以了。
5 结尾
整个网关整合OAuth2.0s授权认证中心的流程就跑通了,那我们就开始抓紧搞项目了。