Безопасность для javascript-приложений на основе Rails: как вы проверяете разрешения для пользователя в отображаемом javascript?

Извините, если это неправильный стек для этого вопроса. Если да, пожалуйста, направьте меня на правильный сайт.

У меня есть приложение rails, где пользователи могут быть членами одной из трех ролей: user, admin или system. Тем не менее, мое приложение-рельсы в основном используется как бэкэнд JSON для базового приложения. Весь тяжелый подъем на стороне клиента осуществляется через файлы coffeescript, которые обрабатываются в конвейере активов.

Прямо сейчас я обрабатываю некоторые пользовательские атрибуты в javascript через объект, который я создаю на уровне application.html.slim. Что-то похожее на это:

APP.currentUser = 
 name: "#{@current_user.name}"
 role: "#{@current_user.role}"

Посыпанные в течение нескольких мест в моих базовых приложениях вызываются следующими вызовами:

if APP.currentUser.role is 'admin'...

Это кажется очень неуверенным, так как любой, у кого есть знания, может открыть консоль dev, измените экземпляр App.currentUser на admin, а затем получите доступ к функциям администратора переднего конца. Теперь сторона рельсов достаточно умна, чтобы проверить и убедиться, что @current_user может выполнять эти функции до того, как она попытается это сделать, но все же кажется, что должен быть способ предотвратить это на переднем конце, не публикуя эту роль в javascript.

Я слишком осторожен или что-то не хватает?

2 ответа

Ну, я не думаю, что вы можете сделать лучше, чем это. Раньше я делал что-то подобное в случаях, когда мне нужно вводить разрешения на действия для моих просмотров. Что-то вроде этого:

В конце Rails:

def as_json(options={})
 super(:include => {
 :attributes_to_include
 }
 ).merge({
 :permissions=> {
 :can_create => (user.can_create?),
 :can_delete => (user.can_delete?),
 :can_update => (user.can_update?)
 }
 })
end

На лицевой панели Backbone

if(@user.permissions.can_create)
 # Display create view
if(@user.permissions.can_update)
 # Display update view
.....

Как правило, это лучшее, что вы можете сделать. Вы не можете скрыть представление от пользователя в интерфейсе, если только вся страница не загружена из контура Rails с разрешениями вида, о которых идет речь. И, конечно, противоречит тому, как обрабатываются представления Ajax в настоящее время.

Кроме того, вам необходимо убедиться, что вы разрешаете действия в конце Rails.


Я не знаю, если вам что-то не хватает, но я не думаю, что есть какой-либо способ получить ваш торт (административный и неадминистрирующий пользовательский интерфейс, находящиеся в одном базовом приложении) и съесть его тоже (сделайте пользовательский интерфейс администратора надежно недоступный для не-админов). Вам в основном нужно выбирать только загрузку пользовательского интерфейса администратора для подтвержденных администраторов и проживание с этим "открытием".

licensed under cc by-sa 3.0 with attribution.