城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

SpringCloudGateway集成SaToken

8月28日 失了心投稿
  引言
  Hello大家好,这里是Anyin。
  在我之前的文章中,不知道大家有没有发现我的代码都是放在AnyinCloud〔1〕这个项目的(欢迎大家点个星星)。这个项目我积累了一些我自己平时在工作当中的小工具和最佳实践,随着时间的推进这个项目已经慢慢成为一个我个人搭建项目的脚手架,能够快速搭建起来一个完善的基于SpringCloud技术栈的微服务基础架构。
  之前在掘金上看到一个权限认证的框架SaToken,简单的了解下,发现确实容易上手,而且功能丰富。今天就让我们来把它集成到AnyinCloud项目吧。需求梳理
  在把SaToken集成到我们的项目之前,我们需要先梳理下需求,不能为了集成而集成。
  1。AnyinCloud项目需要一个认证鉴权的框架,经过选型,确定使用SaToken。
  2。AnyinCloud项目是一个微服务项目,所以我们统一的认证需要放在认证服务Auth,而统一的鉴权是放在网关Gateway。
  3。Auth和Gateway都是高频访问的服务,需要足够轻量,所以我们设计这两个服务都不依赖数据库,并且不会过多依赖其他服务,Auth服务和Gateway服务的数据通信通过Redis。
  4。Gateway服务需要把当前登录用户的标识传递到下游。SaToken集成集成认证Auth服务
  首先,我们先来处理Auth服务。
  添加pom。xml依赖,因为我们需要通过Redis来进行数据通讯,所以需要依赖对应的Redis组件。dependencygroupIdcn。dev33groupIdsatokenspringbootstarterartifactIddependencydependencygroupIdcn。dev33groupIdsatokendaoredisjacksonartifactIddependency
  在Auth服务编写Login方法。按我们之前的需求,Auth需要足够轻量,所以它不会去依赖数据库,在登录的时候需要用户信息,通过用户服务upms远程调用从而获取用户信息。ComponentSlf4jpublicclassUsernameLoginHandlerimplementsLoginHandler{AutowiredprivateSysUserFeignApisysUserFeignAOverridepublicLoginTypeEnumextension(){returnLoginTypeEnum。USERNAME;}OverridepublicLoginUserDTOlogin(String。。。content){TODOparamcheckStringusernamecontent〔0〕;Stringpasswordcontent〔1〕;SysUserRespsysUsersysUserFeignApi。infoByUsername(username)。getData();if(sysUsernull){throwAuthExCodeEnum。USERNOTREGISTER。getException();}TODOaddsaltif(!sysUser。getPassword()。equals(SecureUtil。md5(password))){throwAuthExCodeEnum。USERPASSWORDERROR。getException();}if(UserStatusEnum。DISABLE。getCode()。equals(sysUser。getStatus())){throwAuthExCodeEnum。USERISDISABLE。getException();}sysUser。setPassword(null);StpUtil。login(sysUser。getId());SaTokenInfotokenStpUtil。getTokenInfo();LoginUserDTOusernewLoginUserDTO();user。setSysUser(sysUser);user。setToken(token);}}
  根据SaToken建议的使用方式,在我们对用户密码进行校验正确之后,通过StpUtil。login来进行框架内部的登录操作,这个操作其实是在Redis上记录对应的信息。在Redis上会记录2个信息:
  用户ID,satoken:login:session:开头,它的值还会包含一些其他的信息
  登录的Token,satoken:login:token:开头,它的值就是用户ID
  在登录之后,我们还需要获取token返回给前端,所以这里使用StpUtil。getTokenInfo()获取token信息,最后组装用户信息和token信息返回给前端。
  代码编写好,我们需要对登录接口做下测试。
  好了,登录地认证我们已经处理好了,简不简单?香不香?集成鉴权Gateway服务
  我们接着处理鉴权Gateway服务。老规矩,先添加依赖。
  这里要特别注意了,因为我们的网关是SpringCloudGateway,底层是WebFlux实现,它是基于Reactor模型编程的;而之前的Auth服务是正常的SpringMVC服务,基于Servlet模型编程的。所以我们这里引入的是satokenreactorspringbootstarter
  cn。dev33
  satokenreactorspringbootstarterartifactId
  cn。dev33
  satokendaoredisjacksonartifactId
  接着,我们继续编写Gateway服务的过滤器,在过滤器中我们主要做以下3个事情:
  1。判断哪些路由需要进行鉴权,哪些不需要。
  2。如果需要鉴权,则判断是否登录,未登录则直接返回异常信息。
  3。如果登录,则透传用户ID到下游服务
  对于判断哪些路由需要鉴权,我们可以在动态路由中配置路由的元数据,从而判断当前路由是否鉴权。代码如下:Routeroute(Route)exchange。getAttributes()。get(ServerWebExchangeUtils。GATEWAYROUTEATTR);IntegerneedAuth(Integer)route。getMetadata()。get(GatewayConstants。SYSROUTEAUTHKEY);无需认证的路由if(!NEEDAUTH。equals(needAuth)){returnchain。filter(exchange);}
  当路由需要进行鉴权的时候,我们再使用SaToken提供的isLogin方法进行判断,如果未登录则响应异常信息。如下:判断是否登录if(!StpUtil。isLogin()){returnthis。response(exchange,CommonExCodeEnum。USERNOTLOGIN。getException());}
  如果当前请求用户已经登录,则使用StpUtil。getLoginId方法获取当前用户ID,然后透传到下游服务,如下:privateServerWebExchangesetHeaderLoginId(ServerWebExchangeexchange,StringloginId){ServerHttpRequestrequestexchange。getRequest()。mutate()。header(CommonConstants。USERID,loginId)。build();returnexchange。mutate()。request(request)。build();}
  最后,很关键的一步,我们还需要注册全局的过滤器,除了我们自己编写的过滤器,还有SaToken的过滤器。如果细心的同学可以发现StpUtil工具类提供的方法都是很简单,得益于它需要注册一个全局的过滤器SaReactorFilter,通过该过滤器它把大量的上下文信息和对应的逻辑都在内部处理掉。所以,我们需要注册2个过滤器,如下:BeanpublicGatewayAuthFiltergatewayAuthFilter(){returnnewGatewayAuthFilter();}BeanpublicSaReactorFiltersaReactorFilter(){returnnewSaReactorFilter();}
  其实SaReactorFilter过滤器提供了很多的方法和参数,用来处理各种业务场景,但是因为我这边可能需要对过滤器进行更加定制化的逻辑处理,所以未使用它内部的一些方法。测试
  完成了以上2部分代码,我们需要对其进行测试下,看看框架是否好使。
  首先,测试下不传递token的场景,是否会报未登录的异常。
  传递token的场景下,能够正常返回信息
  最后
  感谢SaToken作者提供了这么一个牛皮的框架。其文档地址SaToken〔2〕。
  以上,就是SpringCloudGateway集成SaToken的步骤,如果有什么问题,欢迎指正。
  如果您觉得文章对您有帮助,帮忙点个关注哈。
  相关源码:AnyinCloud〔3〕References
  〔1〕AnyinCloud:https:gitee。comanyinanyincloud
  〔2〕SaToken:https:satoken。dev33。cn
  〔3〕AnyinCloud:https:gitee。comanyinanyincloud
投诉 评论 转载

坚持努力,一定会有惊喜出现人生不易,坚持着,努力着,偶尔也会想偷懒,想放弃。但是,中途放弃了,之前的辛苦就全部没有任何意义了,重新开始,又要吃更多的辛苦。成功往往就在坚持一下的努力之中。放弃后,就……过膝裙已经过时了,满大街潮人都在穿杏裙,美得高级又显气质显高又显瘦、优雅又知性的过膝裙,不仅深得一大批女性朋友的青睐,也流行了好长一段时间,而且在这个春天,仍然有好多人都在穿过膝裙,可能连你也认为过膝裙还在流行。其实,今年入春……横店20万群演的现状懒汉的天堂,疯子的乐园,光棍的世界我从元谋人开始打工也没他们要交的税款多!这是在演员邓伦被爆出偷税漏税之后一位微博网友写下的话。光鲜亮丽的明星们的收入千万,尽管有时会很辛苦,但也都赚得钵满盆满,而那些同样……SpringCloudGateway集成SaToken引言Hello大家好,这里是Anyin。在我之前的文章中,不知道大家有没有发现我的代码都是放在AnyinCloud〔1〕这个项目的(欢迎大家点个星星)。这个项目我积……叫前夫已经过时了,听马伊琍对文章的称呼,真是大开眼界马伊琍虽然和文章已经离婚,但是她并没有称呼文章前夫,而是阿拉男人,这是一句上海话,意思其实就是我的男人。不得不说马伊琍真的是一个霸气的女人,连对前夫的称呼都这么让人大开眼……春季怎么少得了这12件单品上衣合集Hi,我是BOKA姐,这几天的气温真是奇怪哈,热了几天,然后又冷了下来。不过呢明天开始又会变热了,所以我们的春季单品还是要安排起来的,12件刚整理的合集,看看有没有喜欢的。……顶薪合同,感觉这几位CBA球员的表现配不上啊2122赛季CBA常规赛还剩下7场就将全部结束,不知道大家支持的球队本赛季的表现是如何呢?在如今的CBA赛场,能拿顶薪的球员好像并不一定是能力最强的球员,至少下面几位的表现是配……春季,正值孩子长身体时期,多吃这种食物,小孩快长高还聪明春天成物复苏,花草开始冒出新芽,树木也开始长出新枝,一片欣欣向荣的景象。同样,春天也是孩子长身体、长个子的最佳时期,作为父母的我们不能忽视这点。那么面对这大好时机,如何让……春到潭柘寺谚曰:先有潭柘,后有幽州。幽州乃西晋时的幽州。潭柘寺通往寺院的路,脚下是古香道。道路坑坑窝窝,坎坷不平。千百年来,皇帝王孙商贾百姓,都虔诚地前来进香礼佛。古香……球迷对杜兰特詹姆斯度假不满,有球迷力挺杜兰特,他还单身呢在过去的十年里,凯文杜兰特和勒布朗詹姆斯一直被认为是联盟中最好的球员。虽然勒布朗詹姆斯在过去的大部分时间里一直是联盟最好的超级巨星,但在最近几个赛季,凯文杜兰特也向总冠军发起了……春天到了,来点颜色看看近期各地气温都直线上升,度过白茫茫的冬季,迎来五彩缤纷的春季。相信各位仙女们早已按捺不住,不想再框在黑白灰的世界里,期待为衣橱增添一些新颜色。那么不妨直接copy泫雅风,出自号……俄罗斯接连离队,德国籍主教练吉斯德尔法尔克等人说NO此前与俄罗斯超级足球俱乐部签约的外籍教练和球员纷纷离队,意在抗议该国入侵乌克兰。继国际足联(FIFA)等将俄罗斯排除在国际大赛之外后,个人也提出了NO。莫斯科火车头队主教……
电价上涨冲上热搜背后电力市场正酝酿巨变师生情小记3岁男童手术后变脑瘫,出事后父亲离家出走消息称安卓手机厂商将会全球减产以面对市场销量下降DNA作饵诱捕多种呼吸道病毒2022年谷歌搜索最多的3D打印问题,ChatGPT给出的答国产掌机成了搅局大鲶鱼黄金本周先震荡后下跌!(社会)农旅融合助力乡村振兴浙江永康楼市的危机,发达的金华永康房价,永康楼市的潜力总投资约350亿,永康市2023年度重大前期项目清单严禁工作日饮酒!人保财险发布内部禁酒令,5万亿白酒板块全线杀

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁