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

Next.js按角色限制路由访问:禁止普通用户登录后进入/inventory

Next.js 路由权限控制:限制普通用户访问管理员路径

下面是几种可行的解决方案,覆盖不同场景的需求:

1. Next.js Middleware(推荐,Next.js 12+)

这是全局路由拦截的最佳方案,能在请求到达页面之前完成权限验证,避免页面闪烁或不必要的渲染。

在项目根目录创建middleware.ts(或.js):

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  // 从Cookie中获取用户角色(根据你的实际存储方式调整,比如请求头、session等)
  const userRole = request.cookies.get('user_role')?.value;
  const targetPath = request.nextUrl.pathname;

  // 拦截/inventory路径,仅允许admin角色访问
  if (targetPath.startsWith('/inventory') && userRole !== 'admin') {
    // 重定向到首页,或者跳转到自定义的403无权限页面
    return NextResponse.redirect(new URL('/', request.url));
    // return NextResponse.rewrite(new URL('/403', request.url))
  }

  return NextResponse.next();
}

// 指定需要拦截的路由规则
export const config = {
  matcher: ['/inventory/:path*'], // 匹配/inventory下的所有子路径
};

2. 客户端页面内守卫(useEffect + useRouter)

如果是静态页面(SSG),可以在页面组件内添加验证逻辑,不过会有短暂的页面渲染闪烁:

import { useEffect } from 'react';
import { useRouter } from 'next/router';
// 替换成你项目中获取当前用户角色的方法(比如从Auth Context、Cookie解析)
import { getCurrentUserRole } from '../utils/auth';

export default function InventoryPage() {
  const router = useRouter();

  useEffect(() => {
    const role = getCurrentUserRole();
    if (role !== 'admin') {
      router.push('/');
      // 也可以在这里显示无权限提示,而不是直接跳转
    }
  }, [router]);

  return (
    <div>
      <h1>库存管理后台</h1>
      {/* 管理员专属内容 */}
    </div>
  );
}

3. 服务器端验证(getServerSideProps)

对于需要SSR的页面,直接在服务器端完成权限校验,避免敏感内容泄露:

import { GetServerSideProps } from 'next';

export default function InventoryPage() {
  return (
    <div>
      <h1>库存管理后台</h1>
    </div>
  );
}

export const getServerSideProps: GetServerSideProps = async (context) => {
  // 从请求Cookie中获取用户角色
  const userRole = context.req.cookies.user_role;

  // 验证不通过则重定向
  if (!userRole || userRole !== 'admin') {
    return {
      redirect: {
        destination: '/',
        permanent: false,
      },
    };
  }

  return {
    props: {}, // 传递给页面的自定义数据
  };
};

关键注意点

  • 角色存储安全:不要用localStorage存储用户角色,建议使用HttpOnly Cookie,防止XSS攻击窃取角色信息。
  • 前后端双重验证:前端路由控制只是用户体验优化,后端API必须单独验证用户角色,避免恶意用户直接调用接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:48:23