У меня есть расширенная модель пользователя в коллекции Meteor.users
, в которой я публикую большинство полей для клиента.У каждого пользователя есть поле isAdmin
, по умолчанию установленное на false
.
Теперь у меня есть две проблемы, которые связаны между собой:
Какубедитесь, что компоненты, предназначенные для администраторов, могут отображаться только в том случае, если для поля isAdmin
в коллекции Meteor.users
установлено значение true
?
Какчтобы убедиться, что поле isAdmin
в коллекции Meteor.users
нельзя изменить с консоли клиента?
Относительно 1.
Я не решаюсь опубликовать это поле для клиента и просто оценить isAdmin
на стороне клиента.
Я не уверен, есть ли какой-нибудь хакерский способ через консоль простоизмените isAdmin
таким образом, чтобы можно было отобразить компонент (или его часть), который предназначен только для администраторов клиента .Я мог бы представить, что, например, с помощью Object.defineProperty()
можно сделать это.
Должен ли я использовать server-side rendering
для защиты административной части моего пользовательского интерфейса?
Относительно 2.
Рассмотрим первый абзац Редактирование профиля в этой статье о распространенных ошибках,Он предполагает, что isAdmin
можно легко изменить с клиента, вызвав с консоли Meteor.users.update(Meteor.userId(), {$set: {'isAdmin': true}})
.
Когда я запускаю его, войдя в свое приложение, я получаю update failed: Access denied
.
Но даже официальная документация все еще предлагает добавить
// Deny all client-side updates on the Lists collection
Lists.deny({
insert() { return true; },
update() { return true; },
remove() { return true; },
});
в https://guide.meteor.com/security.html#allow-deny
Существует ответ , предполагающий, что достаточно просто проверитьсвойство isAdmin
на стороне сервера, если вы убедитесь, что Meteor.methods
только для сервера.Но это вовсе не говорит о allow-deny
, и ему 6 лет.
Кто-нибудь может сказать, что на самом деле происходит сегодня?