Мне нравится работать с 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();
}
})
},
У вас все в порядке - все, что требует аутентификации, должно быть выполнено с ** доверенным кодом ** на сервере. Все, что на клиенте ** недоверено **. «Meteor.call» - это то, как вы можете получить доступ к этому серверному коду от клиента. – Matt
@Matt, я отредактировал вопрос, чтобы включить пример Meteor.call, который я делал, и это не сработало бы для меня. – Nate