前端通过用户权限来显示对应权限的页面

  1. 前端框架通用思路

    • 获取权限信息 :用户登录成功后,后端返回用户权限相关数据,如角色(role)、权限列表(permissions)等。前端将这些信息存储在合适的地方,如 Vuex(Vue)、Redux(React)或浏览器本地存储(localStoragesessionStorage)。
    • 路由控制:根据用户权限控制哪些路由(页面)可访问,隐藏或禁止访问无权限的页面。
    • 组件渲染:在组件内部,根据权限决定某些元素(如按钮、菜单等)是否显示。
  2. Vue 框架示例

    • 获取和存储权限信息 :假设使用 Vuex 存储权限信息。

      javascript

      复制代码
      // store.js
      import Vue from 'vue';
      import Vuex from 'vuex';
      
      Vue.use(Vuex);
      
      const store = new Vuex.Store({
        state: {
          userRole: null,
          userPermissions: []
        },
        mutations: {
          setUserRole(state, role) {
            state.userRole = role;
          },
          setUserPermissions(state, permissions) {
            state.userPermissions = permissions;
          }
        }
      });
      
      // 在登录成功的回调中
      import store from './store';
      // 假设response.data.role和response.data.permissions是后端返回的角色和权限信息
      store.commit('setUserRole', response.data.role);
      store.commit('setUserPermissions', response.data.permissions);
    • 路由权限控制 :使用 Vue Router 的导航守卫。

      javascript

      复制代码
      // router.js
      import Vue from 'vue';
      import Router from 'vue - router';
      import store from './store';
      
      Vue.use(Router);
      
      const router = new Router({
        routes: [
          {
            path: '/admin',
            name: 'Admin',
            component: () => import('@/views/Admin.vue'),
            meta: {
              requiredRole: 'admin'
            }
          },
          {
            path: '/editor',
            name: 'Editor',
            component: () => import('@/views/Editor.vue'),
            meta: {
              requiredPermissions: ['editArticle']
            }
          }
        ]
      });
      
      router.beforeEach((to, from, next) => {
        const requiredRole = to.meta.requiredRole;
        const requiredPermissions = to.meta.requiredPermissions;
        const userRole = store.state.userRole;
        const userPermissions = store.state.userPermissions;
      
        if (requiredRole && userRole!== requiredRole) {
          next('/forbidden');
        } else if (requiredPermissions &&!requiredPermissions.every(permission => userPermissions.includes(permission))) {
          next('/forbidden');
        } else {
          next();
        }
      });
      
      export default router;
    • 组件内权限控制 :在组件模板中使用 v - if 根据权限显示元素。

      vue

      复制代码
      <template>
        <div>
          <button v - if="userPermissions.includes('deleteArticle')">删除文章</button>
        </div>
      </template>
      
      <script>
      import { mapState } from 'vuex';
      
      export default {
        computed: {
         ...mapState(['userPermissions'])
        }
      };
      </script>
  3. React 框架示例

    • 获取和存储权限信息 :假设使用 Redux 存储权限信息。

      javascript

      复制代码
      // actions.js
      export const setUserRole = role => ({
        type: 'SET_USER_ROLE',
        payload: role
      });
      
      export const setUserPermissions = permissions => ({
        type: 'SET_USER_PERMISSIONS',
        payload: permissions
      });
      
      // reducer.js
      const initialState = {
        userRole: null,
        userPermissions: []
      };
      
      const userReducer = (state = initialState, action) => {
        switch (action.type) {
          case 'SET_USER_ROLE':
            return {...state, userRole: action.payload };
          case 'SET_USER_PERMISSIONS':
            return {...state, userPermissions: action.payload };
          default:
            return state;
        }
      };
      
      // store.js
      import { createStore } from'redux';
      import userReducer from './reducer';
      
      const store = createStore(userReducer);
      
      // 在登录成功的回调中
      import { setUserRole, setUserPermissions } from './actions';
      // 假设response.data.role和response.data.permissions是后端返回的角色和权限信息
      store.dispatch(setUserRole(response.data.role));
      store.dispatch(setUserPermissions(response.data.permissions));
    • 路由权限控制 :使用 React Router 和自定义高阶组件(HOC)。

      jsx

      复制代码
      // PrivateRoute.js
      import React from'react';
      import { Navigate, Outlet } from'react - router - dom';
      import { useSelector } from'react - redux';
      
      const PrivateRoute = ({ requiredRole, requiredPermissions }) => {
        const userRole = useSelector(state => state.userRole);
        const userPermissions = useSelector(state => state.userPermissions);
      
        if (requiredRole && userRole!== requiredRole) {
          return <Navigate to="/forbidden" />;
        } else if (requiredPermissions &&!requiredPermissions.every(permission => userPermissions.includes(permission))) {
          return <Navigate to="/forbidden" />;
        }
      
        return <Outlet />;
      };
      
      export default PrivateRoute;
      
      // App.js
      import React from'react';
      import { BrowserRouter as Router, Routes, Route } from'react - router - dom';
      import PrivateRoute from './PrivateRoute';
      import Admin from './views/Admin';
      import Editor from './views/Editor';
      import Forbidden from './views/Forbidden';
      
      const App = () => {
        return (
          <Router>
            <Routes>
              <Route path="/admin" element={
                <PrivateRoute requiredRole="admin">
                  <Admin />
                </PrivateRoute>
              } />
              <Route path="/editor" element={
                <PrivateRoute requiredPermissions={['editArticle']}>
                  <Editor />
                </PrivateRoute>
              } />
              <Route path="/forbidden" element={<Forbidden />} />
            </Routes>
          </Router>
        );
      };
      
      export default App;
    • 组件内权限控制 :在组件中使用逻辑与(&&)根据权限渲染元素。

      jsx

      复制代码
      import React from'react';
      import { useSelector } from'react - redux';
      
      const MyComponent = () => {
        const userPermissions = useSelector(state => state.userPermissions);
      
        return (
          <div>
            {userPermissions.includes('deleteArticle') && <button>删除文章</button>}
          </div>
        );
      };
      
      export default MyComponent;
  4. 后端配合:前端的权限控制只是初步的展示控制,后端必须再次验证权限,以防止用户绕过前端限制,直接通过 URL 访问无权限的资源。例如,后端在处理每个请求时,根据请求中的 Token 解析出用户权限,验证该用户是否有权限执行此操作。

相关推荐
222you5 小时前
vue目录文件夹的作用
前端·javascript·vue.js
月屯5 小时前
pandoc安装与使用(html、makdown转docx、pdf)
前端·pdf·html·pandoc·转docx、pdf
我爱学习_zwj5 小时前
Node.js模块化入门指南
前端·node.js
Shirley~~5 小时前
开源项目PPtist分享
前端·typescript·vue
yanghuashuiyue5 小时前
TypeScript是JavaScript超集-百度AI灵魂拷问
前端·javascript·typescript
光头程序员5 小时前
Vite 前端项目 - CSS变量智能提示
前端·css
木易 士心5 小时前
深入理解 TypeScript 声明文件(.d.ts):类型系统的桥梁
前端·javascript·typescript
抹茶冰淇淋5 小时前
面对新电脑,前端开发者需要进行哪些初始化配置
前端·github
HIT_Weston5 小时前
55、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(七)
前端·http·gitlab