2015-12-10 2 views
0

Можно ли указать, что поле не обновляется с использованием самой схемы, а не определяет его в правиле allow/deny?Meteor simpleSchema предотвращает обновление полей

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

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

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

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

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

+0

Я не думаю, что это возможно непосредственно из autoform. Проверьте этот пакет ongoworks: безопасность позволяет определить поле, которое вы разрешаете/запрещаете обновлять, и это более удобно, чем правило allow/deny. – perusopersonale

+0

Спасибо. Просто взглянул на пакет, и я буду использовать его в будущем. К сожалению, он работает только на свойствах верхнего уровня. Поэтому я не могу использовать его для электронных писем. – Chris

ответ

2

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

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

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

Чтобы его обновить с помощью админа только, вы можете попробовать обычай валидатор, который проверяет USERID, чтобы увидеть, если он является администратором (например, требует aldeed: collection2 и alanning: роли)

"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(); 
     } 
    } 
},