Я не хочу, чтобы все мои пользователи могли вставлять/уничтожать данные.
Как защитить клиентский интерфейс MongoDB API?
Ответ 1
[UPDATE] В настоящее время существует официальный и документированный пакет Auth, который предоставляет различные решения для защиты коллекции.
На уровне CRUD:
[Сервер] collection.allow(параметры) и collection.deny(опции). Ограничивает методы записи по умолчанию в этой коллекции. Как только любой из них вызывается в коллекции, все методы записи в этой коллекции ограничены независимо от небезопасного пакета.
И также существует insecure
, чтобы удалить полный доступ на запись с клиента.
источник: Начало работы с Auth (спасибо @dan-dascalescu)
[OLD ANSWER]
Очевидно, что есть работа над пакетом Auth (?), который должен избегать любых пользователей, которые полностью контролируют db, как сейчас. Также есть кто-то, предлагающий, чтобы существовало существующее решение (обходное решение), определяя ваши собственные мутации (методы) и делайте их неудачными, если они пытаются выполнить несанкционированное действие. Я не понял это намного лучше, но я думаю, что это часто будет необходимо, так как я сомневаюсь, что пакет Auth Package позволит вам реализовать обычную логику auth на уровне строк, но, вероятно, только по методам CRUD. Должен увидеть, что разработчики должны сказать.
[EDIT] Нашел то, что, кажется, подтверждает мои мысли:
В настоящее время клиенту предоставляется полный доступ к записи в коллекцию. Они могут выполнять произвольные команды обновления Mongo. Как только мы создадим аутентификацию, вы сможете ограничить прямой доступ клиента к вставке, обновлению и удалению. Мы также рассматриваем валидаторы и другие ORM-подобные функции.
Источники ответа:
Доступ к БД на стороне клиента, как на стороне сервера с помощью метеора
Ответ 2
Пока нет документального способа сделать это, вот какой код, который должен делать то, что вы хотите:
Foo = new Meteor.Collection("foo");
...
if (Meteor.is_server) {
Meteor.startup(function () {
Meteor.default_server.method_handlers['/foo/insert'] = function () {};
Meteor.default_server.method_handlers['/foo/update'] = function () {};
Meteor.default_server.method_handlers['/foo/remove'] = function () {};
});
}
Это приведет к отключению методов insert/update/remove по умолчанию. Клиенты могут пытаться вставить в базу данных, но сервер ничего не сделает, и клиент заметит и удалит локально созданный элемент, когда сервер ответит.
insert/update/remove будет по-прежнему работать на сервере. Вам нужно будет создавать методы с Meteor.methods, которые запускаются на сервере для выполнения любых записей в базе данных.
Все это изменится, когда ветвь аутентификации приземлится. Как только это произойдет, вы сможете предоставить валидаторы для проверки и авторизации записей базы данных на сервере. Здесь немного подробнее: http://news.ycombinator.com/item?id=3825063
Ответ 3
Более сжатый способ:
_.each(['collection1', 'collection2'], function(collection){
_.each(['insert','update', 'remove'], function(method){
Meteor.default_server.method_handlers['/' + collection + '/' + method] = function(){}
});
});
или сделать его более идиоматичным:
удлинить метеор:
_.extend(Meteor.Collection.prototype, {
remove_client_access: function(methods){
var self = this;
if(!methods) methods = ['insert','update','remove'];
if(typeof methods === 'String') methods = [methods];
_.each(methods, function(method){
Meteor.default_server.method_handlers[self._prefix + method] = function(){}
});
}
});
Вызовы проще:
List.remove_client_access() // restrict all
List.remove_client_access('remove') //restrict one
List.remove_client_access(['remove','update']) //restrict more than one
Ответ 4
Я новичок в Meteor, но до сих пор я столкнулся с этими двумя моментами
-
Вы можете ограничить доступ клиента к базе данных, добавив параметры в команду
find
в командной строкеpublish
на стороне сервера. Затем, когда клиент вызываетCollection.find({})
, возвращаемые результаты соответствуют тому, что на стороне сервера будет, например,Collection.find({user: this.userId})
(см. Также Опубликовать определенную информацию для Meteor.users и больше информации для Meteor.user и http://docs.meteor.com/#meteor_publish) -
Одна вещь, которая встроена (у меня есть метеорит 0.5.9), заключается в том, что клиент может только
update
по идентификатору, а не с помощью селекторов. Ошибка при входе в консоль на клиенте, если есть попытка, которая не соответствует.403: "Not permitted. Untrusted code may only update documents by ID."
(см. Понимание "Не разрешено. Неверный код может обновлять документы только по идентификатору." Ошибка метеора).
В связи с номером 2 вам нужно использовать Meteor.methods
на стороне сервера, чтобы клиентские вызовы с удаленной процедурой были доступны клиенту с Meteor.call
.