🏗️ 目录
- 🚪 为什么需要权限区分?
- ⚙️ 思路梳理
- 💻 代码实例------Next.js 路由守护
- 🧩 管理员权限动态渲染
- 🔒 后端验证与防护
- ☕ 总结与哲学彩蛋
🚪 为什么需要权限区分?
想象一下,一个普通用户打开 /admin
页面,满心欢喜地看到------数据库操作后台 。此刻他拥有宇宙毁灭级权限 。
这一刻,系统崩盘,宇宙混乱,婴儿啼哭,项目经理大叫:
"谁写的代码?!"
所以说,权限控制不是锦上添花,而是防止被炒的底裤。
⚙️ 思路梳理
权限其实就是判断用户角色 + 根据角色限制访问范围 。
我们在 Next.js 里可以从两个层面下手:
📁 前端路由保护 :防止用户瞎点网址进入不该去的地方。
🧠 后端接口验证:防止聪明人通过 Curl/hack 直接请求数据。
简化思路如下:
markdown
用户访问页面 → 检查身份 →
├── 管理员 → 放行 🟢
├── 普通用户 → 限制 🚫 或重定向
💻 代码实例------Next.js 路由守护
下面我们在 /pages/_middleware.js
或使用新的 App Router (app/
) 中写一个简单守卫逻辑。
ini
// app/middleware.js
import { NextResponse } from 'next/server';
export function middleware(req) {
const token = req.cookies.get('token'); // 获取登录凭据
const url = req.nextUrl.clone();
// 假设我们已经在 token 里包含了用户角色信息
let role = 'guest';
if (token) {
const payload = JSON.parse(atob(token.split('.')[1]));
role = payload.role;
}
// 管理员区保护
if (url.pathname.startsWith('/admin')) {
if (role !== 'admin') {
url.pathname = '/403'; // 重定向
return NextResponse.redirect(url);
}
}
// 普通用户但访问未登录区
if (url.pathname.startsWith('/user') && role === 'guest') {
url.pathname = '/login';
return NextResponse.redirect(url);
}
return NextResponse.next(); // 安全放行
}
✨ 脑洞补充 :
可以把角色权限配置做成对象映射形式,像 RPG 游戏中的"职业系统":
ini
const ROLES = {
admin: ['read', 'write', 'delete'],
user: ['read'],
guest: []
};
🧩 管理员权限动态渲染
有时候管理员和普通用户共用同一页面,只是显示内容不同。
javascript
// components/Dashboard.js
export default function Dashboard({ role }) {
return (
<div>
<h2>欢迎回来,{role === 'admin' ? '尊贵的管理员 🦸♂️' : '忠诚的用户 👨💻'}</h2>
{role === 'admin' ? (
<button>🔧 管理数据</button>
) : (
<p>📜 您的权限仅限查看 </p>
)}
</div>
);
}
💡 小贴士 :
别忘了用 useEffect
动态判断用户角色,或者用 React context 全局提供。
🔒 后端验证与防护
后端也要小心!不然别人直接用 curl:
arduino
curl -X DELETE https://yourapi.com/admin/deleteAllUsers
这时候,你的系统会说:"明白了,立即毁灭所有用户!"
后端 Node.js/Next.js API 端点要加一层验证:
php
// pages/api/admin/deleteUser.js
export default function handler(req, res) {
const { role } = req.user || {}; // 假设 middleware 已解析身份
if (role !== 'admin') {
return res.status(403).json({ error: 'Forbidden 🕳️' });
}
// 安全操作
res.json({ message: '删除成功 ✅' });
}
所以,双管齐下 才是最安全的做法。
就像穿两层衣服,虽然有点热,但比被黑好!
☕ 总结与哲学彩蛋
类型 | 能做的事 | 常见界面 |
---|---|---|
普通用户 👤 | 浏览、评论、下单 | /user/profile |
管理员 🛡️ | 增删改查、用户管理、系统设置 | /admin/* |
游客 👻 | 注册、登录、浏览首页 | /login , / |
"安全与信任的边界,不在代码,而在开发者的心中。"
------ Next.js 哲学家(或者只是个加班猿)
✨ 彩蛋:简笔图概念化流程图
lua
+-------------+
| 用户访问 |
+------+------+
|
v
+------+------+
| 检查身份令牌 |
+------+------+
|
+--------+--------+
| |
v v
+----------+ +-----------+
| 普通用户 | | 管理员 🦸♂️ |
+----+-----+ +-----+-----+
| |
访问普通区 访问管理区
👋 最终寄语:
不要让你的前端权限逻辑像你半夜写的作文一样混乱。
用 Next.js 优雅地守护你的城堡,让管理员统治数据,而普通用户安心玩耍。