2013-07-25 3 views
12

У меня очень простое приложение, которое не нуждается ни в каких ролях только одного или нескольких пользователей, чтобы иметь возможность входа в систему и использовать администратора сайта.Простой пользовательский контроль в метеор, это безопасно?

Я делаю простую проверку в шаблоне администратора следующим образом:

<template name="admin"> 
{{#if currentUser}} 
{{loginButtons}} 
    {{#if isUserAdmin}} 
    show some stuff here... 
    {{/if}} 
{{ else }} 
{{loginButtons}} 
{{/if}} 
</template> 

Тогда в моих помощниках у меня есть:

Template.admin.isUserAdmin = function(){ 
    var adminEmail = Meteor.user().emails[0].address; 
    if(adminEmail === "[email protected]"){ 
    return true; 
    } else { 
    return false; 
    //add some logic for displaying error template. 
    } 
} 

Этого достаточно, чтобы сохранить приложение безопасно или мне нужно что-то еще в дополнение?

ответ

20

Этого недостаточно. Основное правило: никогда не доверять своему клиенту. Любая часть клиентского кода может быть заменена на что-либо еще - в вашем случае функция isUserAdmin может быть изменена, чтобы возвращать всегда true.

Для обеспечения безопасности вам необходимо установить фильтры безопасности на стороне сервера.

1) Настройте права на запись/удаление для данных, разрешенных только для администраторов. См. http://docs.meteor.com/#allow

2) Если у вас есть данные, которые не должны быть видимыми для всех пользователей, но только для администраторов (таких как ваши электронные письма пользователей, история цен на продукт, неопубликованные статьи и т. Д.), Обязательно проверьте привилегии в publish звонок. Например:

Meteor.publish('unpublishedArticles', function() { 
    if(!this.userId) return null; 
    var user = Meteor.users.findOne(this.userId); 
    if(user.admin) return Articles.find({published: false}); 
    return null; 
}); 

Опять же, важно, чтобы данные фильтруются в publish как subscribe звонки могут быть легко подделаны.

3) Кроме того, не разумно, чтобы ваша электронная почта была встроена непосредственно в код клиента. Лучше (и проще использовать по дороге), чтобы отметить привилегированных пользователей полем admin = true.

Эти шаги должны быть достаточными для обеспечения безопасности вашего приложения.

+1

Это очень хорошие предложения. Связанная, но другая проблема: как вы применяете принципы, которые вы предложили для маршрутизации. Это нужно сделать на стороне клиента. Означает ли это, что нет надежного способа ограничить некоторые маршруты конкретными пользователями. Я знаю об фильтрах в Meteor.Router, но они определены на стороне клиента. – Curious2learn

+1

Ответ взял мне более 600 символов, поэтому я позволил себе скопировать ваш вопрос здесь: http://stackoverflow.com/questions/17874926/restrict-routes-in-meteor-js-to-privileged-users –

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