在前端开发中,授权和角色管理是非常重要的一环。在 Express.js 中,有多种实现授权和角色的方式。本文将对这些方式进行详细讲解,并提供示例代码以供参考。
中间件实现授权
在 Express.js 中,我们可以通过中间件来实现授权。中间件可以控制路由的访问权限,只有经过授权的用户才能访问。
以下是示例代码:
// www.javascriptcn.com code example
const express = require('express');
const app = express();
app.use((req, res, next) => {
const user = req.user;
if (user && user.isAdmin) {
next(); // 继续往下执行
} else {
res.status(403).send('你无权访问该页面!');
}
});
app.get('/admin', (req, res) => {
res.send('欢迎进入管理员界面!');
});如上所示,我们通过 use 方法将中间件应用到所有路由当中。中间件函数可以根据请求中带来的用户信息进行访问授权。此示例中,如果用户不是管理员,则无法访问 admin 路由,否则会返回状态码 403。
Token 实现授权
除了中间件,我们还可以使用 Token 来实现授权。Token 是一种验证用户身份的方法。用户在登录后,服务器会颁发一个 Token 给客户端,客户端每次访问资源时都需要在请求头中携带 Token,服务器就可以根据 Token 来识别用户身份。
以下是示例代码:
// www.javascriptcn.com code example
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const secretKey = 'my_secret_key';
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.status(401).send('你需要登录才能访问该页面!');
jwt.verify(token, secretKey, (err, user) => {
if (err) return res.status(403).send('你无权访问该页面!');
req.user = user;
next();
});
}
app.get('/login', (req, res) => {
const user = { name: '张三' };
const token = jwt.sign(user, secretKey);
res.json({ token });
});
app.get('/admin', authenticateToken, (req, res) => {
res.send('欢迎进入管理员界面!');
});首先我们定义了一个中间件函数 authenticateToken 来验证 Token,之后在 login 路由中颁发 Token。在 admin 路由访问时,需要先经过 authenticateToken 验证,如果验证失败则返回相应的错误信息。
角色实现
除了授权,我们还需要对用户的角色进行管理。在 Express.js 中,我们也有多种方式来实现角色管理。
基于数据库的角色管理
在数据库中我们可以存储用户的角色信息,并在进行授权时进行校验。这是一种比较常见的方式。以下是示例代码:
// www.javascriptcn.com code example
// 用户模型
const User = mongoose.model('User', {
name: String,
role: { type: String, enum: ['admin', 'user'], default: 'user' }
});
// 授权中间件
function authorize(role) {
return function(req, res, next) {
User.findById(req.user._id).exec((err, user) => {
if (err || !user || user.role !== role) {
return res.status(403).send('你无权访问该页面!');
}
next();
});
}
}
// 管理员路由
app.get('/admin', authenticateToken, authorize('admin'), (req, res) => {
res.send('欢迎进入管理员界面!');
});
// 普通用户路由
app.get('/user', authenticateToken, authorize('user'), (req, res) => {
res.send('欢迎进入用户界面!');
});如上所示,我们定义了一个 User 模型来存储用户的角色信息。在授权中间件时,我们使用了一个闭包来动态指定授权的角色。在路由时,我们就可以通过 authorize 中间件来控制路由的访问权限。
基于 JSON 文件的角色管理
在小型项目中我们也可以使用 JSON 文件来存储用户角色信息。以下是示例代码:
// www.javascriptcn.com code example
// 角色信息
const roles = {
admin: ['/admin'],
user: ['/user', '/admin']
};
// 授权中间件
function authorize(req, res, next) {
const user = req.user;
const userRole = user ? user.role : null;
if (!userRole || !roles[userRole]) {
return res.status(403).send('你无权访问该页面!');
}
const allowedRoutes = roles[userRole];
if (!allowedRoutes.includes(req.path)) {
return res.status(403).send('你无权访问该页面!');
}
next();
}
// 管理员路由
app.get('/admin', authenticateToken, authorize, (req, res) => {
res.send('欢迎进入管理员界面!');
});
// 普通用户路由
app.get('/user', authenticateToken, authorize, (req, res) => {
res.send('欢迎进入用户界面!');
});如上所示,我们在一个 JSON 文件中定义了各个角色可以访问的路由,之后在授权中间件中进行检查。
结语
以上是在 Express.js 中实现授权和角色管理的几种方式。不同的应用场景会需要不同的实现方式,开发者可以根据自己的项目需求进行选用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6b1c7a941bf7134c84dcc