# 登录授权流程

打开系统首页,会自动跳转到登录页面/login,输入用户名跟密码,系统默认用户名superadmin,密码admin,点击登录,调用/api/Auth/Login接口,接口返回一个包含accessTokenrefreshToken的对象,登录成功返回的对象结构如下

会根据登录时是否选择了记住我复选框返回不同缓存时间的refreshToken

//登录返回结果对象
{
  code:0,
  message:"",
  data:{
    status:"SUCCESS",
    accessToken:"xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    accessExpiresIn:3600,
    refreshToken:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    refreshExpiresIn:86400
  }
}

前端将accessTokenrefreshToken存放在localStorage中进行缓存,然后跳转到后台主页/,在跳转路由钩子上(详见/src/router/index.js文件),会检测是否已登录(是否缓存accessToken)、是否已获取认证信息(菜单权限信息),然后会调用接口/api/Auth/GetAuthInfo接口,并带上accessTtoken信息,(了解token是怎么传递的)获取当前登录用户所拥有的菜单及权限,返回结果结构如下所示

//获取认证信息返回结果对象
{
  code:0,
  message:"",
  data:{
    userId:-1,
    userName:"",
    permissionMenus:[
      {
        id:2,
        name:"用户管理",
        path:"user",
        parentId:1,
        icon:null,
        isPage:false,
        canRead:true,
        canWrite:true,
        canReview:false
      },
      {
        id:1,
        name:"系统管理",
        path:"sys",
        icon:null,
        isPage:false,
        parentId:null,
        canRead:true,
        canWrite:true,
        canReview:false
      },
      ...
    ]
  }
}

前端会把permissionMenus数组再进行递归循环构建fullPath(完整路径),permissionPath(权限路径)字段(详见/src/router/index.js),然后将数组保存在Vuex用于permission权限对象方法判断权限使用,再递归构建成出菜单数组menus及路由数组layoutRouter(此时的菜单数组与路由数组是不同的,原来的版本是相同的,但后期为了完美实现tab多页面标签功能,所以路由数组改成单层结构)路由数组结构,如下所示

[
  {
    name:"layout",
    path: '',
    component: layout,//这是根据不同配置加载的不同布局组件
    children: [
      {
        path: "/index",
        component: _import("index"),
        meta: { 
          id: -1,
          title: "主页",
          canMultipleOpen:false
        }
      },
      {
        path: "/sys/user",
        component: _import("/sys/user/"),
        meta: { 
          id: 2,
          title: "用户管理",
          canMultipleOpen:false
        }
      },
      ...
    ]
  }
]


构建好后,addRoutesVueRouter中,并将menus保存在Vuex中,用于构建菜单,获取后认证信息后,就继续路由的执行next(),打开后台主页,至此,整个登录认证的流程就完成了。

# 刷新Token

accessToken过期时,接口会返回code为1002的错误代码,此时框架会自动通过缓存的accessTokenrefreshToken调用/api/Auth/RefreshToken接口进行刷新accessTokenrefreshToken,具体代码可看/utils/request.js文件

上次更新: 1/3/2021, 9:01:12 PM