保护您的应用程序免受未授权访问的关键策略和最佳实践。本指南涵盖了从基础密码策略到高级授权机制的所有核心安全措施。
验证用户/设备身份的真实性("你是谁?")
验证用户/设备是否有权限执行操作("你能做什么?")
保护整个身份验证和授权流程的基础措施
使用bcrypt安全存储密码的示例代码:
const bcrypt = require('bcrypt');
const saltRounds = 12;
// 密码哈希
async function hashPassword(password) {
return await bcrypt.hash(password, saltRounds);
}
// 密码验证
async function verifyPassword(password, hash) {
return await bcrypt.compare(password, hash);
}
// 使用示例
const userPassword = 'SecurePassw0rd!';
const hashed = await hashPassword(userPassword);
// 存储 hashed 到数据库
// 验证登录
const isValid = await verifyPassword('inputPassword', hashed);
资源级访问控制的中间件实现:
// 资源权限验证中间件
function resourceAuth(resourceType) {
return async (req, res, next) => {
const resourceId = req.params.id;
const userId = req.user.id;
try {
// 检查用户是否有权访问该资源
const hasAccess = await checkResourceAccess(
userId,
resourceId,
resourceType,
req.method // 请求方法 (GET, POST, PUT, DELETE)
);
if (!hasAccess) {
return res.status(403).json({ error: '无权访问此资源' });
}
next();
} catch (error) {
res.status(500).json({ error: '服务器错误' });
}
};
}
// 使用示例 - 保护用户资源
router.get('/users/:id',
authMiddleware,
resourceAuth('USER'),
getUserController
);
永远不要信任,始终验证。即使在内网环境中,也要验证所有请求的身份和权限。
用户和服务只应拥有完成工作所必需的最小权限。定期审查和撤销不必要的权限。
永远不要信任客户端传递的权限标识。所有权限验证必须在服务端执行。