当前位置: 首页 > 知识库问答 >
问题:

如何使用角色管理访问控制,以不允许基本用户更新未拥有的帐户

刘安志
2023-03-14

在我的nodejsapi中,我使用这个npm-pkgaccesscontrol实现了角色,我还对令牌部分使用了JWT。我的问题是我无法限制基本角色用户更新非他/她自己的帐户。我想实现的是,管理员可以做他想做的任何事情,但作为基本的其他角色是有限的。在我的例子中,我希望具有基本角色的用户能够只更新其拥有的帐户,而不更新任何其他帐户,但现在该帐户不起作用。

在我的邮递员中,我正在用基本角色的令牌调用更新终结点,并尝试更新与令牌不关联的userId。我应该看到的是一条消息,上面写着您没有足够的权限来执行此操作,但是我可以更新。

我使用这个PKG AccessControl的角色

// Access controls roles
const AccessControl = require("accesscontrol");

let grantsObject = {
    admin: {
        user: {
            "create:any": ["*"],
            "read:any": ["*"],
            "update:any": ["*"],
            "delete:any": ["*"]
        }
    },
    basic: {
        user: {
            "create:own": ["*"],
            "read:own": ["*"],
            "update:own": ["*"],
            "delete:own": ["*"],
        }
    }
};

// Init
const accessCtrl = new AccessControl();

// Roles access
// Here adding the access rules and to what we give access to a specific role
// Basic, Moderator, Admin
// Admin => Read/Write full powers
// Moderator => Read access everywhere
// Basic => Read/write own information
exports.roles = (() => {
    accessCtrl.setGrants(grantsObject);

    return accessCtrl;
})();

我的路线

// PUT update user
router.put(
    "/:userId",
    Auth.allowIfLoggedin,
    Auth.grantAccess("updateOwn", "user"),
    UserCtrl.updateUser
);

使用的中间件:

/ Allowing access to right role permission
const grantAccess = (action, resource) => {
    return async (req, res, next) => {
        try {
            console.log(req.user.role);
            // Permission to perform the specified action of the provided resource
            const permission = Roles.roles.can(req.user.role)[action](resource);
            // No permission => 401
            if (!permission.granted) {
                throw new ErrorHandlers.ErrorHandler(
                    401,
                    "You don't have enough permission to perform this action"
                );
            }
            next();
        } catch (error) {
            next(error);
        }
    };
};

// Allow if user logged in
const allowIfLoggedin = async (req, res, next) => {
    try {
        console.log("LOCALS", JSON.stringify(res.locals));
        const user = res.locals.loggedInUser;
        if (!user)
            throw new ErrorHandlers.ErrorHandler(
                401,
                "You need to be logged in to perform this operation"
            );
        // User
        req.user = user;
        next();
    } catch (error) {
        next(error);
    }
};

module.exports = { grantAccess, allowIfLoggedin };

控制器

// UPDATE user
    async updateUser(req, res, next) {
        try {
            // Check empty req.body
            if (Object.keys(req.body).length === 0) {
                throw new ErrorHandlers.ErrorHandler(500, "Nothing to update");
            }
            // Body to update
            const update = req.body;
            // UserId to update
            const userId = req.params.userId;
            // Finding the user to update
            await User.findByIdAndUpdate(userId, update);
            // Updated user
            const user = await User.findById(userId);
            // Response
            res.status(200).json({
                user: user,
                message: "User has been updated"
            });
        } catch (error) {
            next(error);
        }
    },

共有1个答案

朱风史
2023-03-14

因为您应该使用updateAny而不是updateOwn。这个技巧背后的想法是让管理员角色以完全权限访问此路由,然后添加条件以检查其他小情况,例如用户更新他/她自己的数据

router.put(
    "/:userId",
    Auth.allowIfLoggedin,
    // Use updateAny instead of updateOwn
    Auth.grantAccess("updateAny", "user"),
    UserCtrl.updateUser
);

然后,检查grantAccess函数中的userId,如下所示。

// Allowing access to right role permission
const grantAccess = (action, resource) => {
    return async (req, res, next) => {
        try {
            const modifiedAction = action;
            // Check for userId and modify action from updateAny to updateOwn
            // when current user updates his/her own info
            if (req.user.userId === req.params.userId) {
                modifiedAction = action.replace('Any', 'Own');
            }

            // Permission to perform the specified action of the provided resource
            const permission = Roles.roles.can(req.user.role)[modifiedAction](resource);
            // No permission => 401
            if (!permission.granted) {
                throw new ErrorHandlers.ErrorHandler(
                    401,
                    "You don't have enough permission to perform this action"
                );
            }
            next();
        } catch (error) {
            next(error);
        }
    };
};

你可以在这里查看另一个关于授权的精彩视频。

 类似资料:
  • 问题内容: 是否可以使用任何基于角色的开源访问控制系统? 问题答案: 布兰登·萨维奇(Brandon Savage)在他的PHP软件包“ ApplicationACL ” 上做了一个演示,该演示可能会或可能不会完成基于角色的访问。PHPGACL可能也能正常工作,但是我不能肯定地告诉您。 但是,我可以告诉您的是Zend Framework 的Zend_ACL组件将执行基于角色的设置(但是您必须子类化

  • 角色定义 [role_definition] 是RBAC角色继承关系的定义。 Casbin 支持 RBAC 系统的多个实例, 例如, 用户可以具有角色及其继承关系, 资源也可以具有角色及其继承关系。 这两个 RBAC 系统不会互相干扰。 此部分是可选的。 如果在模型中不使用 RBAC 角色, 则省略此部分。 [role_definition] g = _, _ g2 = _, _ 上述角色定义表

  • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您

  • 以下内容是 xingzhou 对 kubernetes 官方文档的翻译,原文地址 https://k8smeetup.github.io/docs/admin/authorization/rbac/ 基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Ku

  • 我在从node.js服务器获取数据时遇到问题。 客户端是: 在服务器端,我还设置了标题: 但我犯了个错误 "XMLHttpRequest无法加载http://localhost:3003/get_testlines.对预试请求的响应没有通过权限改造检查:请求的资源上没有'Access-Control-Prover-Origin'标头。因此,来源http://localhost:3000不允许进入。

  • 我正在开发一个mean stack web应用程序,它包含基于登录用户角色的差异访问。有几个不同的角色,如管理员,政府,志愿者等。 1.如何基于角色管理前端? 目前,我正在为每个角色设置全局标志,如isAdmin、is志愿者、isGovt等,并根据其值,使用 这是正确的说法吗。如果不是,请建议处理UI的正确方法。 2.如果用户没有授权,如何管理后端和重定向路由? 目前我正在尝试使用angular权