2016-03-14 2 views
0

Мне нравится работать с Meteor и попробовать новые вещи, но я часто стараюсь держать в безопасности. Поэтому, пока я создаю прототип приложения, я пытаюсь найти лучшие практики для безопасного хранения приложения. Одна вещь, с которой я сталкиваюсь, - это ограничение пользователя на основе либо рулона, либо независимо от того, вошли ли они в систему. Вот два примера проблем, которые возникают у меня.Метеор: безопасность в шаблонах и Iron Router

// First example, trying to only fire an event if the user is an admin 
// This is using the alaning:roles package 
Template.homeIndex.events({ 
    "click .someclass": function(event) { 
    if (Roles.userIsInRole(Meteor.user(), 'admin', 'admin-group') { 
     // Do something only if an admin in admin-group 
    } 
}); 

Моя проблема с выше, я могу изменить это, набрав: в этой консоли Roles.userIsInRole = function() { return true; }. Уч.

Второй пример - использование Iron Router. Здесь я хочу, чтобы позволить пользователю в «/ чата» маршрута, только если они вошли в систему.

Router.route("/chat", { 
    name: 'chatHome', 
    onBeforeAction: function() { 
    // Not secure! Meteor.user = function() { return true; } in the console. 
    if (!Meteor.user()) { 
     return this.redirect('homeIndex'); 
    } else { 
     this.next(); 
    } 
}, 
waitOn: function() { 
    if (!!Meteor.user()) { 
     return Meteor.subscribe("messages"); 
    } 
}, 
data: function() { 
    return { 
     chatActive: true 
    } 
} 
}); 

Снова я бегу с той же проблемой. Meteor.user = function() { return true; } в этой консоли ударяет этот рисунок вверх. Единственным способом, который я нашел до сих пор, является использование вызова Meteor.method, который кажется неправильным, поскольку они являются заглушками, которые требуют обратных вызовов.

Каков правильный способ решения этой проблемы?

Edit:

Использование обратного вызова Meteor.call не работает для меня, так как он призывает к ответу асинхронно. Он перемещается из крючка, прежде чем он сможет справиться с ответом.

onBeforeAction: function() { 
    var self = this; 
    Meteor.call('someBooleanFunc', function(err, res) { 
    if (!res) { 
     return self.redirect('homeIndex'); 
    } else { 
     self.next(); 
    } 
    }) 
}, 
+0

У вас все в порядке - все, что требует аутентификации, должно быть выполнено с ** доверенным кодом ** на сервере. Все, что на клиенте ** недоверено **. «Meteor.call» - это то, как вы можете получить доступ к этому серверному коду от клиента. – Matt

+0

@Matt, я отредактировал вопрос, чтобы включить пример Meteor.call, который я делал, и это не сработало бы для меня. – Nate

ответ

-1

Я думаю, вы должны попробовать добавить проверку в метод публикации на сервере. Что-то вроде этого:

Meteor.publish('messages') { 


     if (Roles.userIsInRole(this.userId, 'admin', 'admin-group')) { 
      return Meteor.messages.find(); 
     } 
     else { 
      // user not authorized. do not publish messages 
      this.stop(); 
      return; 
      } 

    }); 

Вы можете сделать подобную проверку в своих методах обработки вызовов в сервере.

+1

Это дополнительная проверка безопасности, но это не обязательно. Шаблон все равно будет загружаться, без данных. – Nate

+0

http://www.manuel-schoebel.com/blog/meteorjs-iron-router-filters-before-and-after-hooks. Этот сайт был полезен для меня при работе с железным маршрутизатором. Вместо добавления проверки onBeforeAction для каждого вызова маршрута я создал глобальную проверку Iron Router с помощью «Router.before». Поэтому, когда пользователь не войдет в систему, он будет перенаправлен на заданный маршрут. Я не уверен, что это то, что вы ищете. –

+0

Не совсем, но спасибо за ресурсы и помощь. К сожалению, он также проверяет свои примеры в маршрутизаторах и маршрутизаторах. Прежде чем использовать Meteor.user() на стороне клиента. Это также может быть отменено клиентом с помощью функции «Meteor.user = function() {return true; } 'в консоли. – Nate

Смежные вопросы