【问题标题】:Vue-router: redirect to route if user does not have permissionsVue-router:如果用户没有权限,则重定向到路由
【发布时间】:2019-06-17 13:41:30
【问题描述】:

我有一个vue 项目和laravel 作为back-end,我必须检查用户是否有权访问资源或视图,在后端我使用laravel permissions 来完成此操作,并且它工作正常,我现在遇到的问题出在前端。

我在登录时获取用户权限并将其保存在localStorage,现在如果用户没有权限,我如何防止用户进入某个路由?

例如我有这些路线

    {
      path: 'users',
      name: 'Users',
      component: Users,
      meta : {
        permissions: 'read_users'
      }
    },
    {
      path: 'roles-permissions',
      name: 'RolesPermissions',
      component: RolesPermissions,
      meta : {
        permissions: 'read_roles'
      }
    },
    {
      path: 'roles-permissions/create',
      name: 'CreateRolesPermissions',
      component: CreateRolesPermissions,
      meta : {
        permissions: 'create_roles'
      }
    },
    {
      path: 'roles-permissions/:id/edit',
      name: 'EditRolesPermissions',
      component: EditRolesPermissions,
      meta : {
        permissions: 'edit_roles'
      }
    },
    {
      path: 'customers',
      name: 'Clientes',
      component: CustomersList
    }

如果用户没有['read_roles','create_roles','edit_roles','read_users'] 的权限,她应该被重定向到customers

var 权限 = localStorage.getItem('permissions'); var can = to.meta.permissions ? (permissions.includes(to.meta.permissions) || to.meta.permissions == '*') : true;

如何做到这一点?

【问题讨论】:

    标签: laravel vue.js permissions vue-router


    【解决方案1】:

    这是一个使用 Vue 路由器实现身份验证的好例子:https://scotch.io/tutorials/vue-authentication-and-route-handling-using-vue-router

    基本上,您可以在让用户打开受保护的组件之前检查权限。实现这一点的最简单方法是使用路由器防护。在您的路由器定义中:

    {
      path: '/protected',
      beforeEnter(to, from, next) {
        if (isAuthenticated()) {
          if (!hasPermissionsNeeded(to)) {
            next('/page-to-show-for-no-permission');
          } else {
            next();
          }
        } else {
          next('/page-to-show-for-unauthenticated-users');
        }
      }
    }
    

    这个守卫将防止进入/protected url。在这里你可以检查工作的codepen:https://codepen.io/anon/pen/JwxoMe

    以下是所有路由的 aa guard 示例:

    router.beforeEach((to, from, next) => {
      if (isAuthenticated()) {
        if (!hasPermissionsNeeded(to)) {
          next('/page-to-show-for-no-permission');
        } else {
          next();
        }
      } else {
        next('/page-to-show-for-unauthenticated-users');
      }
    })
    

    更多关于路由器保护:https://router.vuejs.org/guide/advanced/navigation-guards.html#per-route-guard

    【讨论】:

    • 问题不是用户的认证而是检查权限,如果我在路由上设置了所需的权限,我如何在router.beforeEach上得到它?
    • 以上代码可同时用于:检查身份验证和授权。同样的方式,您可以检查用户是否已登录以及他是否需要权限。
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多