在我的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);
}
},
因为您应该使用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权