0

是否可以使用模式本身指定字段不可更新,而不是在允许/拒绝规则中定义它?

我想知道,因为我使用快速表单允许用户根据用户文档(帐户包)编辑他们的用户详细信息,并且我想防止他们能够更改其电子邮件地址的已验证状态。

基于用户角色的规则只允许管理员和流星本身更改该字段的状态。

我希望有这样的事情:

    emails: {
        type: Array,
        optional: true
    },
    "emails.$": {
        type: Object
    },
    "emails.$.address": {
        type: String,
        regEx: SimpleSchema.RegEx.Email
    },
    "emails.$.verified": {
        type: Boolean
        allowRoles: ['admin','system'] // this does not exist
    },

问候,克里斯

4

1 回答 1

2

你有几个不同的选择。

为了防止任何人更新字段,您可以在标志定义中设置 denyUpdate 字段(需要 aldeed:collection2)

"emails.$.verified": {
    type: Boolean
    denyUpdate: true
},

要允许它仅由管理员更新,您可以尝试使用自定义验证器检查 userId 以查看它是否是管理员(示例需要 aldeed:collection2 和 alanning:roles)

"emails.$.verified": {
    type: Boolean
    custom: function() {
      if ( this.isSet && this.isUpdate &&  !Roles.userIsInRole(this.userId, "admin") ) {
        return "unauthorized";
      }
    }
},

您可能还想为“未经授权的”验证错误定义一条消息。

SimpleSchema.messages({
   "unauthorized" : "You do not have permission to update this field"
})

如果用户尝试更改字段,这将向用户显示错误。

或者,您可以简单地取消设置非管理员用户提供的值,并允许其余更新继续进行。

"emails.$.verified": {
    type: Boolean
    autoValue: function() {
      if ( !Roles.userIsInRole(this.userId, "admin") ) {
        this.unset();
      }
    }
},
于 2015-12-10T01:45:16.017 回答