微服务中satoken的使用

一.网关层(gateway)

1.引入依赖

    这里需要注意,网关层和我们普通的服务层引入的satoken依赖是不一样的,基于Reactor模型的,如:SpringCloud Gateway等等,我们需要引入的是:sa-token-reactor-spring-boot-starter,基础微服务引入的就是sa-token-spring-boot-starter依赖,如果你在普通微服务集成了sa-token-reactor-spring-boot-starter,你的登录肯定是写在基础微服务的,那么可能在你使用StpUtil.login(username),这里我使用username为loginid,如果依赖引入不对将会报出无法获取上下文的错误,或者基础微服务启动失败, StpUtil.login(username),的作用就是将(loginid,sasession)加入redis中,(satoken,loginid)加入到redis

下面的两个依赖集成redis鉴权需要用的依赖

      sa-token-redis-jackson依赖,当一个用户登录成功之后,使用StpUtil.login(username)保存登录信息,会自动将我们当前saseesion,的信息保存到redis中去,key为loginid,value也就是sasession,还会向redis中放入key为token值,value为当前用户名也就是loginid保存到redis中去,具体自动保存到redis的东西看下图,这个依赖就是序列化的作用

2.gateway层的实现

          gateway进行鉴权,我们需要实现satoken提供的这个接口StpInterface,因为权限信息的获取,可以有多种方法

         比如直接从mysql中获取,或者从redis中获取,如果从redis中获取,需要我们用户注册的时候,给用户分配role,也就是在将用户插入user表的时候,同时插入userid_roleid表,然后从roleid_permissonid查到权限集合,使用redistemple将username(也就是loginid),permissList)放入到redis中,回到原题要在gateway鉴权那就需要权限集合,实现接口StpInterface重写getrole(),getpermiss()

就可以获取到权限了

        重写StpInterface接口

         编写配置类,将SaReactorFilter加入到ioc容器中实现请求的拦截,实现鉴权(网关层),之前我们已经实现了stpinterface接口,在这里就需要获取到权限,匹配路径进行鉴权

                这里gateway的路由转发需要说明一下,下面使我网关层的一个转发文件

      test_auth,唯一id,这里我写的是模块名,uri: lib//gzwd-auth 中的gzwd-auth就是我们的微服务名称,predicates 就是我们拦截匹配的地址只要url前缀带有/auth,即就是转发到gzwd-auth微服务,filter就是取消第一前缀, 例如我们们当前的url为 localhost:8081/auth/auth/register,匹配到对应微服务后,取消第一前缀 通过网关层 url就为 /auth/register

4.非微服务项目如何鉴权

这张图来自satoken的官方文档,详细说明可以去官方文档

5.这里我们需要探讨一个问题了,satoken是如何实现分布式鉴权的

         在这里我们讨论一下传统鉴权方式

                1.直接在cookie里面保存我们的登录信息,缺点: 保存大小由限制,明文不安全

                2.使用seesion存在cookie里面的,返回时自动注入,无需手动返回,在访问一个网站时,在HTTP请求中往往会携带一个cookie,这个cookie的名字是JSESSIONID,这个JSESSIONID表示的就是sessionid,这个是由服务器创建的,并且是唯一的。服务器在使用session时,会根据JSESSIONID来进行不同操作,缺点,保存在服务器无法实现分布式统一鉴权, request.getSession().setAttribute(username, zhangsan),只要我们向session中放入了信息就会自动在返回头里添加一个set-cookie的属性返回给前端

                   登录之后的response

                下次的requestheader

                3.jwt,自定义的解析方式,前端携jtoken,后端拿到解析成功即可实现鉴权,需要手动返回

                4.sasession,,但是我们不直接存session信息到后端服务器,而是存到redis里面,微服务就从这里面拿到信息,这样就实现了分布式鉴权了

                                                                                                        如有错误请在评论区指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值