You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于访问权限的Docusaurus动态侧边栏内容实现方案问询

在Docusaurus中实现多级别访问控制与动态侧边栏

完全可以实现这个需求,核心是基于用户权限动态过滤侧边栏内容,同时配合路径级访问控制确保未授权用户无法访问受限文档。以下是具体实现方案:

1. 定义带权限标记的完整侧边栏配置

在sidebars.js中维护包含所有文档的侧边栏,并给每个文档项添加权限标记:

module.exports = {
  fullSidebar: [
    {
      type: 'doc',
      id: 'public/intro',
      metadata: { permission: 'public' }
    },
    {
      type: 'doc',
      id: 'authenticated/advanced-guide',
      metadata: { permission: 'authenticated' }
    },
    {
      type: 'doc',
      id: 'admin/operation-manual',
      metadata: { permission: 'admin' }
    },
    // 更多文档项...
  ]
};

2. 自定义侧边栏组件实现动态过滤

复制Docusaurus默认的侧边栏组件到src/theme/Sidebar/index.js,在组件内部根据用户权限过滤渲染内容:

import React from 'react';
import Sidebar from '@docusaurus/theme-classic/lib/theme/Sidebar';
import { fullSidebar } from '../../../sidebars';

// 实际项目中从登录状态/后端接口获取用户权限
const getUserPermission = () => {
  return localStorage.getItem('userRole') || 'public';
};

// 根据权限过滤侧边栏项
const filterSidebarItems = (items, userPermission) => {
  return items.filter(item => {
    const itemPerm = item.metadata?.permission;
    if (!itemPerm) return true; // 无标记项默认公开

    switch(userPermission) {
      case 'admin':
        return true;
      case 'authenticated':
        return itemPerm === 'public' || itemPerm === 'authenticated';
      default: // 未登录用户
        return itemPerm === 'public';
    }
  });
};

export default function CustomSidebar(props) {
  const userPerm = getUserPermission();
  const filteredItems = filterSidebarItems(fullSidebar, userPerm);
  return <Sidebar {...props} items={filteredItems} />;
}

3. 配合路径级访问控制拦截未授权访问

在src/pages/_app.js中添加路由守卫,防止用户手动输入URL访问受限文档:

import React from 'react';
import { useLocation, Redirect } from '@docusaurus/router';

export default function App({ Component, pageProps }) {
  const location = useLocation();
  const userPerm = localStorage.getItem('userRole') || 'public';

  // 路径与所需权限的映射
  const pathPermMap = {
    '/docs/authenticated/': 'authenticated',
    '/docs/admin/': 'admin'
  };

  // 检查当前路径是否需要权限
  const requiredPerm = Object.keys(pathPermMap).find(path => location.pathname.startsWith(path));
  if (requiredPerm) {
    const hasAccess = userPerm === 'admin' || userPerm === pathPermMap[requiredPerm];
    if (!hasAccess) {
      return <Redirect to="/docs/public/intro" />;
    }
  }

  return <Component {...pageProps} />;
}

注意事项

  • 生产环境中不要仅依赖前端localStorage判断权限,需配合后端接口验证用户角色,防止篡改
  • 敏感文档建议在后端层面做访问控制,避免用户通过直接请求文档资源获取内容

内容的提问来源于stack exchange,提问作者Kazuki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:45:41