首页 > 其他分享 >若依框架登录鉴权详解

若依框架登录鉴权详解

时间:2024-09-05 14:24:17浏览次数:11  
标签:roles res ajax 若依 token 详解 user commit 鉴权

若依框架(Ruoyi)后端的登录权限身份认证流程是一个复杂但高效的过程,它确保了系统的安全性和数据的保护。以下是一个典型的若依框架后端登录权限身份认证流程,基于多个来源的信息进行归纳和整理:

1.发起请求获取认证凭证(token)

现象:用户未登录或者token过期,刷新页面将重定向至登录页面

  • 如果用户身份验证通过,系统会生成一个认证凭证(如JWT,即JSON Web Token)。
    • 认证凭证的生成过程可能包括生成一个唯一的UUID作为token的一部分,并设置token的有效期(这个有效期可能是通过Redis等缓存系统来控制的,因为JWT本身不直接支持自动刷新有效期)。
    • 生成的token会包含用户的基本信息和权限信息,以便后续进行权限控制和身份验证。
    • 后端通过验证后返回一个包含用户信息的令牌(Token),前端将这个令牌保存起来(如存储在Cookie、LocalStorage或SessionStorage中)以后的请求都需要带上这个令牌进行验证
​
//login.vue
handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true;
          if (this.loginForm.rememberMe) {
            Cookies.set("username", this.loginForm.username, { expires: 30 });
            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
          } else {
            Cookies.remove("username");
            Cookies.remove("password");
            Cookies.remove('rememberMe');
          }
          this.$store.dispatch("Login", this.loginForm).then(() => {
            //存储title至vuex
            this.$store.commit("settings/SET_HEADTITLE",this.title)
            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
          }).catch(() => {
            this.loading = false;
            if (this.captchaEnabled) {
              this.getCode();
            }
          });
        }
      });
    }
//store/modules/user.js
// 前端登录请求
    Login({ commit }, userInfo) {
      const username = userInfo.username.trim()
      const password = userInfo.password
      const code = userInfo.code
      const uuid = userInfo.uuid
      return new Promise((resolve, reject) => {
        login(username, password, code, uuid).then(res => {
           //!!!key!!!
          //获取并设置后端传过来的token
          setToken(res.data.token)
          commit('SET_TOKEN', res.data.token)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },
//system/SysLoginController
//后端登录响应
    /**
     * 登录方法
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @SaIgnore
    @PostMapping("/login")
    public R<Map<String, Object>> login(@Validated @RequestBody LoginBody loginBody) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
            loginBody.getUuid());
        ajax.put(Constants.TOKEN, token);
        return R.ok(ajax);
    }


​

2. 获取认证信息(user、roles and permission)

不同用户的权限不同,右侧导航条【大层面】和页面中操作按钮【小层面】不同

  • 将生成的token和用户的相关信息(如用户ID、角色、权限等)缓存起来,以便后续快速验证和查询。
//store/modules/user.js

// 获取用户信息【前端请求】
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo().then(res => {
          const user = res.data.user
          const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/profile.jpg") : user.avatar;
          if (res.data.roles && res.data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
            commit('SET_ROLES', res.data.roles)
            commit('SET_PERMISSIONS', res.data.permissions)
          } else {
            commit('SET_ROLES', ['ROLE_DEFAULT'])
          }
          commit('SET_NAME', user.userName)
          commit('SET_AVATAR', avatar)
          resolve(res)
        }).catch(error => {
          reject(error)
        })
      })
    },

//system/SysLoginController
//后端响应返回用户信息【user、roles and permisssions】
    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @GetMapping("getInfo")
    public R<Map<String, Object>> getInfo() {
        LoginUser loginUser = LoginHelper.getLoginUser();
        SysUser user = userService.selectUserById(loginUser.getUserId());
        Map<String, Object> ajax = new HashMap<>();
        ajax.put("user", user);
        ajax.put("roles", loginUser.getRolePermission());
        ajax.put("permissions", loginUser.getMenuPermission());
        return R.ok(ajax);
    }

 

标签:roles,res,ajax,若依,token,详解,user,commit,鉴权
From: https://blog.csdn.net/m0_55049655/article/details/141923686

相关文章

  • 互联网算法备案必要性+攻略全流程详解【附件+流程】
    一、算法备案的重要性算法备案是指相关企业或组织向有关部门提交其使用的算法的相关信息,以接受监管和审查。这一举措有助于确保算法的公正性、透明性和合法性,保护用户的权益,促进数字经济的健康发展。算法备案必要性强制性例如,在推荐系统中,如果算法存在偏见或歧视,可能会导致......
  • ANSYS实用功能详解(一)——弱弹簧
    我们在做静力学分析时,有时会遇到这种情况:一个结构,在对其进行受力分析时,它是平衡的,但在ANSYS中计算的时候,软件会报错,求不出结果来。比如下图所示一根杆,两端受到等值反向共线的力F作用,根据二力平衡公理,这根杆是平衡的。下面,我们使用ANSYS计算一下这个结构。Step1:建立模型。在......
  • 神经网络之卷积篇:详解卷积神经网络示例(Convolutional neural network example)
    详解卷积神经网络示例假设,有一张大小为32×32×3的输入图片,这是一张RGB模式的图片,想做手写体数字识别。32×32×3的RGB图片中含有某个数字,比如7,想识别它是从0-9这10个数字中的哪一个,构建一个神经网络来实现这个功能。用的这个网络模型和经典网络LeNet-5非常相似,灵感也来源于此......
  • 深入解析OpenStack Cinder:块存储服务详解
    目录OpenStack简介Openstack中的存储:虚机对块存储的要求:Cinder介绍主要组件Cinder基本功能Cinder命令行通用命令卷操作卷快照操作卷备份操作卷与实例的操作卷迁移其他Cinder工作流程Cinder插件OpenStack简介OpenStack是一个开源的云计算管理平台项目,它是......
  • Java顺序表和链表万字详解
    1.线性表的概念线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,......
  • opencv全面详解教程
    opencv全面详解教程1.OpenCV简介2.安装OpenCV2.1使用pip安装(适用于Python)2.2通过conda安装2.3从源码编译(高级)3.OpenCV基本操作3.1读取和显示图像3.2保存图像3.3视频处理4.图像处理操作4.1调整大小和裁剪4.2颜色空间转换4.3图像平滑(滤波)4.4边......
  • 详解 Visual Studio、MSVC、编译器版本,看完就不再困惑啦!
    新手在刚使用VisualStudio开发C++应用程序时往往会对其版本产生困惑,包括VisualStudio版本、MSVC版本、工具集版本等等。因此本文尝试给大家解释一下VisualStudio不同版本号的对应关系。以VisualStudio2022为例,版本信息包括:VisualStudio发布年份(营销版本号......
  • VMware vSphere各项关键性能监控指标详解
    VMwarevSphere提供了一个叫esxtop的性能监控与故障排错工具供管理员日常维护vSphere虚拟化平台使用,接下来,让我们分别从CPU、内存、磁盘和网络等四个维度去说明如何通过esxtop工具实现性能与故障排错。(1)esxtop工具使用执行环境:进到ESXishell或者SSH连接到ESXi的控制台(默认shel......
  • 【C语言】详解数组
    文章目录前言一、数组的概念二、一维数组1.一维数组的创建2.一维数组的初始化3.一维数组的使用4.一维数组在内存中的存储三、二维数组1.二维数组的创建2.二维数组的初始化3.二维数组的使用4.二维数组在内存中的存储前言一、数组的概念(数组是一组相同类型元素......
  • Linkedlist源码详解
    介绍LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,......