springcloud网关层鉴权

鉴权:用户登录之后发放一个新的token,用户访问应用的时候校验username和token是否有效。

token:类似于访问应用的一个钥匙。token存在且有效才可以访问应用,否则403,request forbidden。

实现鉴权的组件:spring的security和apache的shiro。

基于token实现鉴权的技术:oauth、某大型应用使用的推飞、jwt鉴权。

实现鉴权的三大板块:

    1、auth-service。提供token的创建(用户登录后发放一个新的token)、验证(校验username和token是否有效,无效则403requestforbidden)和刷新服务。

    2、auth-service-api。使用接口抽离的层次结构,抽离出实体类、响应类和feign的interface,为保持其纯洁性,不包含任何业务代码和方法的编写,纯粹地只是包含属性和抽象方法。

    3、gateway-sample。将过滤器添加到网关地路由规则中,直至路由生效。

实现鉴权的具体逻辑:

    1、登录。首先校验数据库用户名和密码是否存在且正确。若正确,使用jwt生成token,将username、token、refreshToken(UUID.RandomUUID())设置进Account中。redis中存储account并把refreshToken当作key。token实则被存储在account中。refreshToken的作用在于从redis中获取account。

    2、验证。传递username和token验证当前token是否有效。

    3、刷新即将过期的token。验证refreshToken是否可以从redis中获取到account,如果account存在,则使用account(实际上起作用的是其中的username)创建一个token。重新生成一个refreshToken。删除redis中旧的refreshToken。将新的refreshToken和account设置进redis并返回success。刷新和login都会response一个account。验证仅仅response成功或者失败。

token的创建和校验:

    使用jwt创建token。

        1、算法。使用HMA256算法对token进行加密和解密。

        2、key。在外部加密之后再传入系统,开发人员不允许查看。是HMA256算法的一个参数。

        3、issuer。发行人。发行人联合key使得代码更加具有健壮性。黑客必须同时破解key和issuer才有可能使得token验证成功。

        4、当前时间。设置发行token的发行、创建时间。

        5、token的有效时间。是一个时间戳,当前时间+有效时间得出token过期的具体时间。时间过后,该token就不在有效。

        6、claim。额外参数,可以是username和role(角色)。在验证token有效性的基础上额外验证username(传递进来的方法参数)是否和token创建之初指定的username是否一致。若不一致会直接throw Exception,代表token无效。

       7、sign(algorithm)。用来return一个token,参数是指定的HMA256算法对象。

    使用jwt校验token。

        1、issuer。校验发行人是否与token创建之初指定的发行人是否一致。虽然发行人在JwtService是一个静态常量,创建和校验都是使用的同一个发行人。所以这一层校验必过。开发人员知道,但是对于非开发人员来说,猜对不是一件易事。

       2、claim(USER_NAME,username)。额外校验方法请求参数中的username与token创立之初设置的username是否一致。

      3、require(glorithm)。选择token创立之初同样的算法对象HMA256用于解密。加密和解密使用的算法要用同一个。

      4、使用verifier的verify(token)验证token是否有效。只要没有throw Exception就代表token有效。

      5、使用JWT的静态方法require()获取JWTVerifier类实例。用于调用verify(token)。

auth-service、auth-service-api、gateway-sample三个module之间的关系:

    1、auth-service和gateway-sample都以依赖的方式引入了auth-service-api。gateway-sample要用到远程调用的依赖,故需要引入。auth-service-api需要使用到Product和Response实体,故需要引入。引入也可以理解为扩展extend,子module除了拥有父module中的接口、实体外,还能有自己独立的扩展。俗话说的好,青出于蓝胜于蓝。

gateway-sample引入说明:gateway不需要使用web相关类实例。如果非要用web,那也必须引入webflux而不是web。所以需要在引入auth-service-api的时候exclude掉web。

服务的启动顺序:eureka-server>feign-client>gateway-sample(如果启动顺序有偏差,那么头几分钟内访问不了服务,因为gateway依赖的feign-client还没有注册到eureka-server)

postman的status稍微注意下,会与代码中设置的response的设置的StatusCode一致。

网关技术选型:1、gateway(基于springcloud的项目)。2、nginx。3、F5(有钱的大公司)。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值