微服务网关鉴权的解决方案,微服务实现网关统一鉴权方法

4747 1584 2023-07-19


本文讲了微服务网关鉴权的解决方案,微服务实现网关统一鉴权方法。

解决方案:微服务网关实现简单鉴权

关键词

JWT(xxxxx.yyyyy.zzzzz)

JJWT工具

网关过滤器解析TOKEN

在网关系统中比较适合进行权限校验

一、微服务架构下统一认证思路

基于Session的认证方式

在分布式的环境下,基于session的认证会出现一个问题,每个应用服务都需要在session中存储用户身份信息,通过负载均衡将本地的请求分配到另一个应用服务需要将session信息带过去,否则会重新认证。我们可以使用Session共享、Session黏贴等方案。

Session方案也有缺点,比如基于cookie,移动端不能有效使用等

基于Token的认证方式

优点:服务端不用存储认证数据;易维护扩展性强;客户端可以把token 存在任意地方;可以实现web和app统一认证机制

缺点:token由于自包含信息,因此一般数据量较大,而且每次请求都需要传递,因此比较占带宽。另外,token的签名验签操作也会给cpu带来额外的处理负担

二、基于Token的认证方式(JWT)

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

2.1 头部(Header):

作用:在头部指明了签名算法

例如:{“typ”:“JWT”,“alg”:“HS256”}

将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分

2.2 载荷(playload):

作用:载荷就是存放有效信息的地方

例如:{“sub”:“1234567890”,“name”:“John Doe”,“admin”:true}

将其进行base64加密,得到Jwt的第二部分

2.3 签名(signature):

作用:jwt的第三部分是一个签证信息,这个签证信息由三部分组成

header (base64后的)

payload (base64后的)

secret

例如:HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload)+ secret )

内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己 编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。

鉴权逻辑

开发中的鉴权逻辑:


当客户端第一次请求服务时,服务端对用户进行信息认证(登录)

  • 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证

  • 以后每次请求,客户端都携带认证的token

  • 服务端对token进行解密,判断是否有效。

image.png

如上图,对于验证用户是否已经登录鉴权的过程可以在网关层统一检验。检验的标准就是请求中是否携 带token凭证以及token的正确性。

代码实现

下面的我们自定义一个GlobalFilter,去校验所有请求的请求参数中是否包含“token”,如何不包含请求 参数“token”则不转发路由,否则执行正常的逻辑。

@Componentpublic class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChainchain) {
   //String url = exchange.getRequest().getURI().getPath();        //忽略以下url请求        //if(url.indexOf("/login") >= 0){        // return chain.filter(exchange);        // }        String token = exchange.getRequest().getQueryParams().getFirst("token");
       if (StringUtils.isBlank(token)) {
       log.info( "token is empty ..." );
       exchange.getResponse().setStatusCode( HttpStatus.UNAUTHORIZED );
       return exchange.getResponse().setComplete();
   }
   return chain.filter(exchange);}@Overridepublic int getOrder() {
   return 0;
   }}

  • 自定义全局过滤器需要实现GlobalFilter和Ordered接口。

  • 在filter方法中完成过滤器的逻辑判断处理

  • 在getOrder方法指定此过滤器的优先级,返回值越大级别越低

  • ServerWebExchange 就相当于当前请求和响应的上下文,存放着重要的请求-响应属性、请求实 例和响应实例等等。一个请求中的request,response都可以通过 ServerWebExchange 获取

  • 调用 chain.filter 继续向下游执行

一、背景介绍:

之前做微服务项目的时候鉴权操作都放在了各个服务中,每个服务都集成了spring security或者shiro框架或者写拦截器自己做鉴权操作,最近刚好有时间实现网关统一鉴权。之前:

image.png

统一鉴权之后服务呢就是单纯提供资源的服务了,叫资源服务。

image.png

鉴权操作一般都是有个单独的授权服务,实现方式:

1、网关调用授权服务的鉴权接口

2、网关和授权服务连接同一个redis

3、token使用jwt

个人感觉第一种方式不太可取,访问资源的每个接口网关都需要调用下授权服务有点鸡肋,增加了授权服务的压力,我选择2和3两种方式进行了实现,只不过使用jwt方式想要主动使此token过期功能则需要另外实现,jwt生成时就已经规定了什么时间过期。

二、授权认证时序图

image.png

这是第二种实现方式,网关和授权服务连接同一个redis,第三种就是除了没有redis其他流程一样,所以这也是统一鉴权其中一种好处,换框架换校验方式等只需要修改网关就行了。

流程:

① 用户申请令牌(可理解为登录)

② 授权服务颁发令牌(登陆成功返回token)

③ 用户拿到令牌去访问接口 (前端把token放到请求头)

网关鉴权(接口级别的权限,有访问权限则把用户信息通过redis或者jwt解析出来,再通过base64加密或者其他加密算法把用户信息加密,如果资源服务不对外暴露全是内网用base64就行了,速度快,我使用的是AES对称加密)

⑤ 资源服务解析用户信息并生成上下文(解析并提供一个静态工具类能获得当前用户的信息方便业务使用)

上文就是小编为大家整理的微服务网关鉴权的解决方案,微服务实现网关统一鉴权方法。

国内(北京、上海、广州、深圳、成都、重庆、杭州、西安、武汉、苏州、郑州、南京、天津、长沙、东莞、宁波、佛山、合肥、青岛)API接口文档平台软件分析、比较及推荐。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动化接口测试:提升软件质量的关键策略还是多余的负担?
下一篇:zTree插件下拉树使用入门教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~