【RuoYi-Cloud项目研究】【ruoyi-gateway模块】网关的AuthFilter完成“认证”,注意是认证而不是权限

这篇具有很好参考价值的文章主要介绍了【RuoYi-Cloud项目研究】【ruoyi-gateway模块】网关的AuthFilter完成“认证”,注意是认证而不是权限。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


过滤器的功能是检验经过网关的每一个请求,检查 token 中的信息是否有效。

注意是“认证检查”,而不是“权限”,权限是在每个服务的Controller上贴权限注解

1. 功能介绍

1、在用户完成登录后,程序会把用户相关的用户、角色、权限等信息临时存储在 redis 中,并把token返回给终端用户。

1、毕竟返回的token只存储了极其少量的用户信息,避免传输的数据量太大

2、RuoYi 返回的 token 中存储的信息有:

user_key:login_tokens:uuid(存入redis中用的)

user_id:userId

username:userName

2、当用户携带token时,我们判断 token 是否有效,关联的用户是否登录。如果token有效就把user_key、user_id、username 设置到请求头中

此处主要是检验 token 是否有效。

设置到请求头,统一处理,也方便其他模块

2. AuthFilter的配置

@Component
public class AuthFilter implements GlobalFilter, Ordered
{
    private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
    
    @Autowired
    private RedisService redisService;


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        ...
    }
}

AuthFilter 实现了GlobalFilter, Ordered,是一个全局过滤器,所有的模块都有。这也很好理解,所有的模块当然都需要检查 token 是否有效啊。

3. AuthFilter实现分析

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpRequest.Builder mutate = request.mutate();

        String url = request.getURI().getPath();
        // 1、检验路径
        if (StringUtils.matches(url, ignoreWhite.getWhites()))
        {
            return chain.filter(exchange);
        }
        String token = getToken(request);
        // 2、是否有token
        if (StringUtils.isEmpty(token))
        {
            return unauthorizedResponse(exchange, "令牌不能为空");
        }
        // 3、解析token,判断是否是有效的token
        Claims claims = JwtUtils.parseToken(token);
        if (claims == null)
        {
            return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
        }
        String userkey = JwtUtils.getUserKey(claims);
        // 4、判断用户是否登录
        boolean islogin = redisService.hasKey(getTokenKey(userkey));
        if (!islogin)
        {
            return unauthorizedResponse(exchange, "登录状态已过期");
        }
        String userid = JwtUtils.getUserId(claims);
        String username = JwtUtils.getUserName(claims);
        // 5、检查token是否有userId、userName
        if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))
        {
            return unauthorizedResponse(exchange, "令牌验证失败");
        }

        // 6、设置用户信息到请求
        addHeader(mutate, SecurityConstants.USER_KEY, userkey);
        addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
        addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
        // 7、内部请求来源参数清除
        removeHeader(mutate, SecurityConstants.FROM_SOURCE);
        return chain.filter(exchange.mutate().request(mutate.build()).build());
    }

1、检验路径

路径uri白名单检验,如果是白名单,直接通过。

2、是否有token

3、解析token,判断是否是有效的token

只有有效的 token 才会解析出信息而不报错。

4、判断用户是否登录

auth 的权限校验有一个校验用户是否登录的注解。

5、检查token是否有userId、userName

6、设置用户信息到请求头

7、内部请求来源参数清除

8、继续下一个过滤器

4. 资料参考

语雀笔记地址:https://www.yuque.com/yuchangyuan/tkb5br文章来源地址https://www.toymoban.com/news/detail-729830.html

到了这里,关于【RuoYi-Cloud项目研究】【ruoyi-gateway模块】网关的AuthFilter完成“认证”,注意是认证而不是权限的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ruoyi-cloud—若依微服务打包部署

    1. 前端端口修改 2. 后端端口修改 (1)修改ruoyi-gateway服务中的bootstrap.yml的port端口  (2)修改ruoyi-ui中的vue.confing.js的target中的端口 3. 后端部署 (1) 在本地电脑上代码界面上打包后端 在 ruoyi 项目的 bin 目录下执行 package.bat 打包Web工程,生成jar包文件。不同模块版本会生成在

    2024年01月21日
    浏览(51)
  • 若依微服务版启动(RuoYi-Cloud)教程

    之前一直有小伙伴咨询若依微服务版如何在本地启动,今天简单的给大家介绍一下。 首先,学习Java的小伙伴应该对若依框架都应该有所了解,RuoYi-Cloud 是一个 Java EE 分布式 微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud Alibaba、Vue、Element),内置模块如:部门管

    2024年01月18日
    浏览(30)
  • 【云原生】3.5 RuoYi-Cloud部署实战(下)

     哈喽~大家好呀,这篇呢我们接着上篇来讲。  🥇个人主页:个人主页​​​​​              🥈 系列专栏:【云原生系列】 🥉与这篇相关的文章:             【云原生】3.2 Kubernetes 实战之多租户系统实战 【云原生】3.2 Kubernetes 实战之多租户系统实战_程序猿追的博

    2024年02月03日
    浏览(32)
  • 结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

    原视频链接 https://www.bilibili.com/video/BV1mg4y1s75r/?spm_id_from=333.337.search-card.all.clickvd_source=c15794e732e28886fefab201ec9c6253 结合 RuoYi-Cloud 和 RuoYi-App 实现微信小程序的授权登录。 之前讲过前后端分离版的授权登录,逻辑大致一致,不同点有: 微信头像和昵称的获取方式。由于最新的本地

    2024年02月09日
    浏览(45)
  • RuoYi-Cloud 若依微服务版启动教程(保姆级)

    RuoYi-Cloud 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Cloud Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。 1、系统环境 J

    2023年04月09日
    浏览(45)
  • 若依框架(RuoYi-Cloud 微服务版本)134节视频教程

    RuoYi-Cloud 是一个 Java EE 分布式微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。 在线体验 若依

    2024年02月13日
    浏览(33)
  • 若依cloud(RuoYi-Cloud)新增业务模块和功能模块增删改查演示

    前言 看了几篇文章感觉都不太满意,索性自己来写一篇。 一、后端 后端新建业务模块流程大致如下: 看一下目录结构, business 就是我们自己的业务模块: 1.0 新建业务模块 就是在 ruoyi-module模块 下新建一个 springboot 工程模块,大家既然都学到cloud了,我相信这一步也不用多

    2024年02月17日
    浏览(36)
  • 若依开源框架-微服务版本(ruoyi-Cloud)使用说明-超详细

    JDK 1.8 Mysql 5.7以上 Nacos 2.0.3 Node 14 版本以上 打开网站: RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|J

    2024年02月04日
    浏览(86)
  • 【docker快速部署微服务若依管理系统(RuoYi-Cloud)】

    工作原因,需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合,它有足够多的中间件,而且官方提供docker安装,但我本人在安装过程中遇到了很多坑,在这里记录一下防止下次会再次遇到。 https://gitee.com/y_project/RuoYi-Cloud 内存至少16G,处理器至少4核 内

    2024年02月09日
    浏览(43)
  • 若依RuoYi-Cloud框架前端vue安装时报 core-js/modules/es.error.cause.js错误怎么解决?

    如下所示,新手安装若依RuoYi-Cloud框架前端vue时会报如下错误: ERROR Failed to compile with 7 errors This dependency was not found: core-js/modules/es.error.cause.js in ./node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js, ./src/directive/permission/hasRole.js and 5 others To install it, you can run: npm install --save core

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包