我正在使用 Keycloak 保护问题跟踪系统 API。
我创建了以下角色:用户、管理员和代理。这些角色适用于 UI 页面访问和核心管理端点,但我面临的问题是区分用户所有权。现在只使用基本角色,任何用户都可以编辑任何用户的票证。
这是我想要做的:
资源 - /api/v1/tickets/{id}/update
DESIRED POLICY - 只有创建票证的用户角色(所有者)或管理员角色可以编辑
API 使用 Node.js,Keycloak 客户端是“机密”的,启用了身份验证。
我的端点的 Keycloak 拦截看起来像这样。
router.post('/tickets/:id/update', keycloack.protect(['user', 'admin']), ticketCtrl.update)
我可以编写一个辅助方法来根据我想的 Auth 令牌中的 ticketId 和 Keycloak userIdToken 进行检查。
伪方法 *
isTicketOwner = () => (req, res, next) => {
let ticketId = req.params.id;
let userIdToken = parseJwt(req.header.authentication).userIdToken;
let query = tickets.find({ id: ticketId, userId: userIdToken });
return query.length ? next() : res.status(401).send('Unauthorized');
}
但理想情况下,我希望 Keycloak 处理此验证并避免额外的数据库调用。当我创建票证时,我需要一种方法来为 Keycloak 建立用户对资源的所有权。
谁能推荐一种合理的方法?