自学内容网 自学内容网

前端权限控制

前端权限控制

一、路由权限(控制页面访问)

  • vue
// router.js
const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: () => import('@/views/Dashboard.vue'),
    meta: { requiresAuth: true, roles: ['admin', 'manager'] }
  },
  {
    path: '/user',
    name: 'User',
    component: () => import('@/views/User.vue'),
    meta: { requiresAuth: true, roles: ['admin'] }
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login.vue')
  }
];

const router = new VueRouter({
  routes
});

// 路由守卫
router.beforeEach((to, from, next) => {
  const userRole = getUserRole();  // 获取当前用户角色

  if (to.meta.requiresAuth && !isLoggedIn()) {
    next('/login');  // 如果需要登录,且用户未登录,跳转到登录页面
  } else if (to.meta.roles && !to.meta.roles.includes(userRole)) {
    next('/403');  // 如果用户角色不匹配,跳转到无权限页面
  } else {
    next();  // 继续访问
  }
});

export default router;
  • react
// App.js
import { Route, Redirect } from 'react-router-dom';

const ProtectedRoute = ({ component: Component, roles, ...rest }) => {
  const userRole = getUserRole();  // 获取当前用户角色

  return (
    <Route
      {...rest}
      render={props =>
        userRole && roles.includes(userRole) ? (
          <Component {...props} />
        ) : (
          <Redirect to="/403" />
        )
      }
    />
  );
};

// 使用示例
<ProtectedRoute
  path="/admin"
  roles={['admin']}
  component={AdminDashboard}
/>

二、界面元素控制(按钮、菜单显示控制)

  • vue
<!-- 在模板中根据用户角色来显示不同的元素 -->
<template>
  <div>
    <button v-if="hasPermission('edit')">编辑</button>
    <button v-if="hasPermission('delete')">删除</button>
  </div>
</template>

<script>
export default {
  methods: {
    hasPermission(permission) {
      const userPermissions = getUserPermissions();  // 获取用户权限列表
      return userPermissions.includes(permission);  // 判断是否有该权限
    }
  }
};
</script>
  • react
const Button = ({ permission, children }) => {
  const userPermissions = getUserPermissions();  // 获取用户权限

  if (!userPermissions.includes(permission)) {
    return null;  // 如果没有权限,返回 null,不显示该按钮
  }

  return <button>{children}</button>;
};

// 使用示例
<Button permission="edit">编辑</Button>
<Button permission="delete">删除</Button>

三、前端权限控制与后端配合

前端权限控制并不是完全安全的,前端的权限控制通常是为了优化用户体验,防止用户在没有权限的情况下看到不应该看到的内容。但真正的权限验证应该在后端进行。

  • 前端: 前端通过 API 调用时会携带用户的认证信息(如 JWT Token 或 Session),然后前端判断是否显示相应的功能、页面等。

  • 后端: 后端在收到请求时,验证请求中的认证信息,并根据用户的角色和权限返回合适的数据。如果用户没有权限,应该返回 401(未授权)或 403(禁止访问)状态。

四、前端权限存储与管理

  • LocalStorage / SessionStorage:用于存储用户的权限信息、角色等。注意:由于这些存储机制容易被客户端修改,因此只能用于界面展示的控制,不适合存储敏感信息。

  • Cookies:也可以用于存储权限信息,尤其是在与后端配合时,使用 Cookie 存储会更加安全,通常与会话管理(如 JWT)一起使用。

  • Context / Redux / Vuex:用于在应用中全局管理用户权限,确保在各个组件之间共享权限数据。

五、权限优化和安全性注意

  • 权限验证要和后端验证配合:前端的权限控制只能起到用户体验的作用,真正的安全性和数据访问控制必须由后端来做。
  • 最小权限原则:每个用户仅应有执行其工作所需的最小权限,不要将过多的权限授予给用户。
  • 动态权限控制:有时权限可能会变化,前端可以通过 API 动态获取权限列表并更新 UI。

原文地址:https://blog.csdn.net/weixin_45932565/article/details/144347383

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!