我知道我可以在数据库操作实际发生在服务器上之前使用方法 stub 来模拟数据库操作,正如 @Akshat 所解释的 in this excellent answer
我想知道是否可以并且应该使用 stub 来确保用户在不涉及任何数据库操作时有权执行操作(例如显示编辑按钮)。
请注意,我不想使用 alanning:roles 包,我想了解它是如何工作的以及是否可以按如下方式完成:
假设我想检查管理员权限。每个用户文档都有一个 roles
字符串数组字段,我在其中存储用户全局权限,即 user
、admin
、superadmin
等
我在 lib
文件夹中声明我的 Users
集合,可供客户端和服务器使用:
let Users = Meteor.users
export default Users
我创建一个方法 stub 来仅检查客户端的管理员权限(它位于客户端文件夹中):
Meteor.methods({
UserIsAdmin = function () {
console.log(this.isSimulation) //Will be true
let user = Users.findOne({_id: Meteor.userId()})
return !!(user && user.roles && user.roles.indexOf('admin') != -1)
}
});
在服务器文件夹中,我将创建真正的方法,该方法调用下面编写的内部服务器函数(请注意,在这种情况下,我可以将 userId
设置为参数):
import Users from '/imports/user/lib/user_collection.js'
Meteor.methods({
UserIsAdmin = function () {
console.log(this.isSimulation) //Will be false
return Users.isAdmin()
}
});
Users.isAdmin = function (userId=Meteor.userId()) {
var user = Users.findOne({_id: userId})
return !!(user && user.roles && user.roles.indexOf('admin') != -1)
};
现在假设我的 UI 上有一个编辑按钮,我根据 UserIsAdmin
方法的结果显示它。问题如下:
- 如果用户设法以某种方式更改 Angular 色数组或弄乱该方法,我假设该按钮将一直显示,直到服务器应答方法调用,对吧?但这对延迟没有帮助,无论如何都会加载 UI。
- 同样的情况(用户不是管理员,但在本地修改了他的
role
数组),但我们在加载路由之前检查该方法:将加载路由及其 UI,对吧?没有回滚吗?当然,用户界面不会被填充,因为发布不会返回任何内容。 - 我拒绝允许/拒绝规则中的每个插入/更新/删除,因此我可以认为用户无法修改自己的文档。如果是这样,是否值得花时间为不执行任何数据库操作的方法编写方法 stub ?我的意思是,这不是保护 UI 的可靠方法(请参阅上面的问题 2),而且数据无论如何都不会被发布。除了数据库操作之外,是否存在编写方法 stub 有意义的情况?
最佳答案
您的代码取决于 Meteor 方法的返回值,但您有一个客户端和一个服务器端返回值。幸运的是,您将获得哪一个是明确定义的:
- 如果您的
Meteor.call()
中有回调,则call
函数不会返回任何内容,并且将通过服务器调用回调函数-侧返回值。 - 如果您的
Meteor.call()
中没有回调,那么您将同步获取客户端返回值。
无论哪种方式,您都只会看到其中一个返回值。它与订阅不同,订阅的值稍后会以某种方式同步。请参阅此处的文档:http://docs.meteor.com/#/full/meteor_call
并回答您的问题:
- 取决于您是否使用回调。如果没有,则会出现管理 UI,并且不会回滚。
- 与 1 相同。
- 您应该始终假设用户能够并且愿意修改所有客户端数据。拒绝规则根本不会改变这一点,它们只会阻止这些更改传播到服务器。
除了数据库操作之外,您还可以使用服务器端方法调用执行多种操作,例如使用 key 访问第 3 方 REST API、启动后台操作等。
alanning:roles
包的工作方式是它有一个通过订阅保持同步的 roles
集合。他们的 Roles.userIsInRole 函数不是 Meteor 方法,而是查询此集合的简单函数调用。
关于javascript - 我应该对没有数据库操作的方法使用 Meteor 方法 stub 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477831/