Подтвердить что ты не робот

Шаблоны для безопасности JavaScript с внутренней авторизацией?

Я ищу несколько полезных ресурсов, шаблонов и практик, касающихся обработки основных требований безопасности, таких как авторизация, в JavaScript на стороне клиента.

Я создаю веб-сайт с внутренней системой, использующей одну из общих инфраструктур MVC. Внутренний сервер будет обрабатывать все реальные потребности в безопасности: авторизация и аутентификация. Фронт будет построен с Backbone.js, jQuery и несколькими другими библиотеками, чтобы облегчить очень богатый пользовательский интерфейс.

Вот пример одного сценария, который мне нужно обработать:

У меня есть сетка данных с несколькими кнопками сверху. Если вы выбираете элемент в сетке, некоторые кнопки становятся включенными, поэтому вы можете принять это действие для выбранного элемента. Эта функциональность легко построить...

Теперь мне нужно рассмотреть авторизацию. Внутренний сервер будет отображать только кнопки, с которыми пользователь может работать. Кроме того, серверный сервер проверяет авторизацию, когда пользователь пытается выполнить это действие.... так что задний конец закрыт, и пользователь не сможет делать то, что они пытаются, если они не авторизованы.

Но как насчет JavaScript? Если мой код настроен с помощью кучи обработчиков кликов jQuery или других событий, которые включают и отключают кнопки, как мне обращаться с кнопками, которые там не существуют? Я просто пишу кучу уродливых операторов if, проверяющих наличие кнопки? Или я пишу JavaScript таким образом, который позволяет мне отправлять JavaScript только для существующих кнопок, вплоть до браузера, на основе авторизации? или

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

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

4b9b3361

Ответ 1

Есть три довольно простых вещи, которые я мог видеть:

  • Модульные представления о магистралях Я очень любил вложенные и высокомодульные представления Backbone. То есть каждая строка в вашем дереве может быть представлением Backbone и реагировать на их собственные требования авторизации.

  • Хэши нескольких событий Настройте несколько хэшей событий в представлении, которое вы отключите с помощью функции delegateEvents() на основе ваших требований к авторизации и вызвано событием. Таким образом, вы получаете множество уродливых операторов if.

  • Несколько шаблонов. В том же ключе вы указываете несколько шаблонов для рендеринга на основе требований авторизации.

Для всех трех потребуется настройка структуры событий (например, с помощью собственного обработчика vent PubSub), где вы запускаете проверки авторизации на основе ответа запроса сервера RESTful или на основе некоторой клиентской функции.

Ответ 2

То, как я обрабатываю аутентификацию на клиенте, состоит в том, чтобы иметь одноэлементную модель Backbone, которая содержит значение isAuthenticated, которое я изначально заполнял с сервера:

@{
  App.user.set({ isAuthenticated: @UserSession.IsAuthenticated.ToString().ToLower() });
}

Затем все элементы управления/функциональные возможности javascript, которые изменяют поведение на основе аутентификации, в основном просто прослушивают изменения в этом поле и переделывают себя в правильное состояние. Все это представление/логика выполняется с помощью JavaScript, поэтому он работает во время создания страницы (сервером) или на клиенте с Javascript/ajax.

Я не поддерживаю обработчики событий существующей/скрытой функциональности, я повторно создаю все элементы пользовательского интерфейса и повторно подключаю все обработчики событий после повторной визуализации представлений на основе флага isAuthenticated.

Приятно то, что после входа в систему с ajax на клиенте (т.е. после того, как страница сервера была отображена) вам просто нужно установить одно и то же поле и, как по мановению (Backbone FTW:), все работает и корректно отображает,

Ответ 3

Все, что на стороне клиента может быть взломан. Итак, что мы делаем в нашем единственном приложении js, это права на сервере. Мы объединяем список прав для каждого пользователя и имеем токен OAuth, который мы передаем клиенту, и отправляется обратно с каждым запросом. затем на стороне сервера перед тем, как действие будет предпринято, мы увидим, аутентифицирован ли пользователь для этого действия.

Конечно, это не защитит вас от кого-то в кафе с помощью пожаротушения... но это еще одна проблема.

Ответ 4

Я бы рекомендовал использовать шаблон Factory вместе со свойствами класса Backbone для инициализации разных представлений в зависимости от авторизации пользователя. В приведенном ниже примере я определяю базовый GridView, который содержит все стандартные и общие поведения. AdminGridView и EditorGridView содержат специальные функции, определенные пользователем. В упрощенном примере ниже обработчик кликов будет подключен только для администраторов.

Приятно, что все инкапсулировано так, что только Factory должен знать о AdminGridView и EditorGridView. Ваш код будет просто взаимодействовать с GridView.

// GridView is an abstract class and should not be invoked directly 
var GridView = Backbone.View.extend({ 

    // put all common / default code here

    _template: _.template($('#grid').html()),

    initialize: function(){
        this.model.bind('change', this.render, this);
    }.

    onButtonClick: function(){
        // do something
    },

    render: function(){ 
        $(this.el).html(this._template(this.model));
    } 
}, { 

    create: function (options) { 
        switch (options.authorization.get('type')) { 
            case 'admin': 
                return new AdminGridView(options); 
            case 'editor': 
                return new EditorGridView(options); 
            default:
                throw new Error('Authorization type ' + options.authorization.get('type') + ' not supported.'); 
        } 
    } 
}); 

var AdminGridView = GridView.extend({
    // put admin specific code here
    events: {
        'click .button': 'onButtonClick'
    }
}); 

var EditorGridView = GridView.extend({
    // put editor specific code here
});

var authorization = new Backbone.Model({ type: 'admin' });
var gridView = GridView.create({ model: someModel, authorization: authorization });
$('body').append((gridView.render().el))

Ответ 5

Поскольку вы упомянули основную схему, ваш код не должен быть

связка обработчиков кликов jQuery

но вместо этого вы можете использовать модели для хранения данных о авторизации и соответствующим образом реагировать на ваши взгляды.

Ответ 6

То, как мы справляемся с этим, - это позволить серверу отправить нам html, который нужно визуализировать, на основе решения или решений, которые приводят к последствию. что-то вроде этого

this.ActionFor(Model)
                .Decision<Authentication1>()
                .Decision<Authentication2>()
                .Consequence<HTMLRenderer>()

Вы могли бы использовать этот шаблон аналогично в JS, если считаете, что вам нужно.

Ответ 7

На стороне клиента пусть JQuery позаботится об этом. Если элемента нет, он ничего не делает. Он только прикрепляет обработчики событий к тем элементам, которые он находит, вам не нужна проверка if-an-element-exist, просто используйте селектора JQuery.