这是提交给Permit.io授权挑战的作品:AI接入控制,
我创建的东西智医是一款由AI驱动的医疗助手,允许患者立即得到诊断和治疗建议,利用OpenAI(ChatGPT)技术。但这还不是全部——该应用程序旨在通过内置的权限控制来模仿真实的工作流程,确保所有AI的建议在传递给患者前都会由持证医生审核。
这不仅仅是一次演示——它是一个现实且可扩展的解决方案,展示如何通过Permit.io实现细粒度、基于角色和属性的访问控制(ABAC)。
试用版🧪 实时前端: https://rainbow-parfait-febebb.netlify.app/auth/login
⚙️ 实时后端API: https://smart-doctor-backend.onrender.com/api/
测试凭证:
角色 用户名 密码
ADMIN admin 2025DEVChallenge
DOCTOR doctor 2025DEVChallenge
PATIENT patient 2025DEVChallenge
进入全屏,退出全屏
项目仓🔗 GitHub: https://github.com/sumankalia/smart-doctor (点击访问)
🛡️ 特性访问表注:保留原符号"🛡️"以保持原文风格和语境。
在智能医疗平台中,授权不仅限于前端角色检查——而是通过Permit.io实施的集中化策略,与我们的后端系统紧密集成。下面是如何利用Permit在我们的智能医疗平台上实现安全保护的方法。
✅ 实时用户同步功能
一旦在 MongoDB 中创建了一个用户,就会实时同步到 Permit。
await permitInstance.api.syncUser({
key: user._id.toString(),
first_name: user.firstName,
last_name: user.lastName || ".",
email: user.email,
});
全屏 退出全屏
这保证每个用户都存在于许可仪表盘,并通过策略进行管理。
自动分配角色
同步完成后,我们将根据情况动态分配角色。
await permitInstance.api.assignRole({
role: 角色映射.医生, // 或 Admin, Patient
tenant: "default",
user: user._id.toString(),
});
全屏模式 退出全屏
这使我们能够完全外部化访问逻辑——用户只能根据其角色以及资源的状态查看或执行相应操作,例如,AI诊断是否已获得批准。
操作指南:这里有一份一步一步的操作指南,展示了智能医生是如何工作的,涵盖用户流程的每个步骤以及细致入微的权限管理。
1. 患者:提交新病例申请
登录的患者首先通过一个简单的表单来报告症状。
- 前端将这些数据发送到后端API。
- 后端调用OpenAI API生成诊断并制定治疗计划。
- 然后将病例分配给工作量最小的一位医生。

2. AI:生成诊断 + 治疗
根据您提交的症状,后台会调用OpenAI(ChatGPT模型)并返回推荐的诊断和治疗建议。(由ChatGPT模型提供)
const userQuery = `
症状有:${symptoms}
病例详情:${caseDescription}
其他相关信息:${additionalInfo}
请分两部分回复:
1. 可能的判断
2. 建议的治疗方案
`;
const chatCompletion = await openai.chat.completions.create({
model: process.env.OPENAI_MODEL,
messages: [
{
role: "system",
content: userQuery,
},
{
role: "user",
content: `请分析以下医疗案例,并提供专业的医疗评估意见:\n\n${userQuery}`,
},
],
temperature: 0.7 ,
max_tokens: 1000 ,
});
const aiResponse = chatCompletion.choices[0].message.content;
全屏模式 退出全屏
3. 医生:查看 + 批准/拒绝
医生会收到分配给他们的新病例,并可以做如下操作:
- 查看人工智能生成的结果
- 批准诊断或治疗
- 覆盖并编辑这些结果
- 添加备注
Permit.io确保只有被指派处理该病例的医生才有权限编辑该记录。

4. 管理员:管理生态系统(不越界干预)
管理员可以做到:
- 查看所有用户和病例信息
- 重新指派医生
- 更新病例情况
但是请注意:管理员不能修改诊断信息或治疗信息字段。此安全保护措施通过在 Permit.io 平台上使用 ABAC 策略规则来确保。
5. 基于角色的用户界面
每个用户角色对应一个不同的界面:
- 患者: 只能查看自己的病例及其对应的AI回复。
- 医生: 只能编辑自己负责的病例的AI回复。
- 管理员: 具有完全查看权限,但写入权限有限。
每次在涉及敏感信息的操作之前,Permit.io 的检查都会通过自定义中间件运行。
// 中间件权限检查
const 允许;
if (资源 === 角色映射表.Patient || 资源 === 角色映射表.Doctor) {
允许 = await permitInstance.check(decoded._id.toString(),
操作, {
类型: "users",
属性: {
角色: 资源,
},
});
} else {
允许 = await permitInstance.check(
decoded._id.toString(),
操作,
资源
);
}
检查权限函数("create", "medical_test")
切换到/退出全屏
6. 边缘情况及安全防范
- 如果AI诊断失败的话,医生会被提示进行手动诊断。
- 患者不能重新编辑病例。
- 未经授权的访问会从后台触发403拒绝访问。
这个想法源于健康科技领域中人工智能使用的增加,以及确保AI在系统设计中不越界的重要性。我想探讨:
- 人工智能可以提出治疗建议,但最终的决定权还是留给人类。
- 我们如何通过访问策略控制AI的回复?
- 如何确保一个真正的应用程序能够让患者看不到未经批准的AI内容,同时防止管理员更改诊断结果?
我将Permit.io探索为一个完美的ABAC解决方案。它允许我外部定义策略的同时保持代码的干净和可扩展性。最大的挑战在于让Permit和AI逻辑顺畅地交流,但是一旦我将权限模块化(创建了protect
和checkPermission
中间件),一切就都顺利起来了。
这个项目展示了在医疗领域的AI权限管理的实际演示:
- 患者 可以提交症状并仅查看 仅由医生批准的人工智能结果。
- 医生 可以审查、批准或修改 人工智能生成的诊断和治疗建议。
- 管理员 可以管理用户和分配权限,但 无法访问人工智能数据 — 这是一种以治理为先的设计。
Permit.io 如何帮助了我们
或者简单地说:### Permit.io 如何帮助
- 使用了 Permit.io 的 ABAC 模型,并定义了资源级别的权限(例如
users
和medical_cases
)。 - 定义了角色(例如
patient
,doctor
,admin
),并强制执行了如read
,update
,approve
等操作。 - 添加了
checkPermission("update", "medical_case")
中间件来保护与 AI 相关的接口。
通过将AI生成与用户访问分离,并用由Permit.io驱动的访问控制门(access gates)将其包裹起来,该应用展示了AI如何在不受监控的情况下保持有用。
特别感谢大家:特别感谢 Permit.io 建立了一个开发者友好的访问控制系统,并且组织了这次黑客马拉松!
由 Suman Kumar 用心打造
[MCP]: Model Context Protocol
[LLM]: Large Language Model
[RAG]: Retrieval 增强生成
[SSE]: Server-Sent Events
共同學習,寫下你的評論
評論加載中...
作者其他優質文章