钉钉 AI 客服:企业级权限设计
权限系统是企业应用的基础。
一、权限模型
| 模型 | 说明 |
|---|---|
| RBAC | 基于角色 |
| ABAC | 基于属性 |
| ACL | 访问控制列表 |
二、RBAC 设计
2.1 角色定义
const ROLES = {
admin: {
name: '管理员',
permissions: ['*']
},
manager: {
name: '经理',
permissions: ['view', 'edit', 'export']
},
agent: {
name: '客服',
permissions: ['view', 'chat']
},
viewer: {
name: '访客',
permissions: ['view']
}
};
2.2 权限检查
function hasPermission(user, permission) {
const role = ROLES[user.role];
if (!role) return false;
// 管理员拥有所有权限
if (role.permissions.includes('*')) return true;
return role.permissions.includes(permission);
}
// 使用
if (!hasPermission(req.user, 'edit')) {
return res.status(403).json({ error: '权限不足' });
}
三、数据权限
3.1 数据隔离
async function getChats(user) {
if (user.role === 'admin') {
return db.query('SELECT * FROM chats');
}
if (user.role === 'agent') {
return db.query('SELECT * FROM chats WHERE agent_id = ?', [user.id]);
}
return [];
}
3.2 部门权限
async function getDepartmentChats(user) {
if (user.role === 'admin') {
return db.query('SELECT * FROM chats');
}
return db.query(`
SELECT c.* FROM chats c
JOIN users u ON c.agent_id = u.id
WHERE u.department_id = ?
`, [user.departmentId]);
}
四、操作审计
async function audit(userId, action, resource, details) {
await db.insert('audit_logs', {
user_id: userId,
action,
resource,
details: JSON.stringify(details),
ip: getClientIp(),
timestamp: Date.now()
});
}
// 使用
await audit(req.user.id, 'DELETE', 'faq', { faqId: id });
五、权限管理 API
5.1 分配角色
app.post('/api/users/:id/role', async (req, res) => {
if (!hasPermission(req.user, 'assign_role')) {
return res.status(403).json({ error: '权限不足' });
}
await db.update('users', { id: req.params.id, role: req.body.role });
await audit(req.user.id, 'ASSIGN_ROLE', 'user', { userId: req.params.id, role: req.body.role });
res.json({ success: true });
});
六、安全最佳实践
- 最小权限原则
- 定期审查权限
- 敏感操作二次确认
- 完整审计日志
项目地址:GitHub - dingtalk-connector-pro 有问题欢迎 Issue 或评论区交流