使用所有权用户策略通过 KeyCloak 保护资源端点

时间:2021-03-19 16:43:37

标签: authentication keycloak roles

我正在使用 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 建立用户对资源的所有权。

谁能推荐一种合理的方法?

0 个答案:

没有答案