Meteor simpleSchema предотвращает обновление полей

Можно ли указать, что поле не подлежит обновлению, используя саму схему, а не определяя его в правиле разрешения/запрета?

Мне интересно, потому что я использую быструю форму, чтобы позволить пользователям редактировать свои данные пользователя на основе документа пользователя (пакета учетных записей), и я хочу, чтобы они не могли изменить проверенное состояние для своего адреса электронной почты.

Правило, основанное на ролях пользователей, было бы здорово разрешить только администраторам и самому метеору изменять состояние этого поля.

Я бы надеялся на что-то вроде этого:

    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
    },

С уважением, Крис


person Chris    schedule 10.12.2015    source источник
comment
Я не думаю, что это возможно напрямую из автоформы. Проверьте этот пакет ongoworks:security, он позволяет определить поле, которое вы разрешаете/запрещаете обновлять, и это более удобно для пользователя, чем правило разрешения/запрета.   -  person perusopersonale    schedule 10.12.2015
comment
Спасибо. Только что посмотрел на упаковку, и я буду использовать его в будущем. К сожалению, это работает только на свойствах верхнего уровня. Поэтому я не могу использовать его для электронной почты. $. Проверено сразу.   -  person Chris    schedule 10.12.2015


Ответы (1)


У вас есть несколько разных вариантов.

Чтобы запретить кому-либо обновлять поле, вы можете установить поле denyUpdate в определении флага (требуется aldeed: collection2)

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

Чтобы разрешить его обновление только администратору, вы можете попробовать собственный валидатор, который проверяет идентификатор пользователя, чтобы узнать, является ли он администратором (пример требует 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();
      }
    }
},
person bluebird    schedule 10.12.2015