Derby.js Авторизация

  • Tutorial


Тем временем у Derby появился свой хаб.

Ну а сегодня мы поговорим об авторизации и ограничении доступа к данным. Что лучше использовать everyauth или passport? Сложно ли добавить авторизацию? Как ограничивать доступ к данным? Как разделить приложение для пользователей и админку в рамках одного derby-приложения?




Авторизация



В derby-examples есть пример приложения с авторизацией на everyauth. Как вы можете видеть, довольно легко реализовать авторизацию через twitter, facebook, linkedin, github и т.п. Но у связки derby + everyauth есть определенные проблемы с авторизацией через логин-пароль, связанные с тем, что everyauth сильно привязан к express. Хотя everyauth написал один из создателей derby (задолго до derby), использование этого модуля именно для derby не совсем удобно. В жизни так бывает. По этому рекомендация — использовать passport, который в силу своей архитектуры лучше вписывается в derby. Для большинства случаев вы можете использовать derby-auth, который представляет из себя уже готовый модуль авторизации, реализованный на passport. Как вы можете видеть в нем создаются две коллекции: auth — где находятся пароли пользователей и users — где находятся остальные данные пользоватлей. Почему две коллекции? В derby в данный момент нету возможности ограничивать доступ к полям сущности (entity — объект в бд с ид). Только ко всей сущности сразу или ко всей коллекции. Это связано с ограничениями в share.js. То есть в рамках одной коллекции users, мы не можем разрешить пользователю видеть имена других пользователей, и в то же время, не видеть их паролей. По этому нам нужно две коллекции. Это, пожалуй, самый неприятный момент в данное время в derby и конечно же будет исправлен в будущем.

Ограничение доступа к данным



Мы можем ограничивать доступ к данным на уровне базы данных (точнее сказать на уровне orm или объекта store) с помощью модуля racer-access. В нем вы можете использовать сессии от connect для идентификации пользователей. Используется примерно так:

var racerAccess = require('racer-access');
derby.use(racerAccess);
store.allow('change', 'users', function (some usefull arguments) {
	return true || false;
});


derby.use — так добавляются плагины в derby.
store.allow — так мы задаем правила ограничения доступа к данным. В данном случае правило для изменения коллекции users. Возвращаемые аргументы различаются в зависимости от правил и содержат, в том числе, и connect сессию. Функция возвращает bool — разрешен доступ или нет.
Документации по racer-access нету, но исходники небольшие, читаемые и содержат комментарии.

Клиентские приложения



Мы сделали авторизацию и ограничили доступ к данным. Но что если мы не хотим отправлять в браузер пользователя темплейты, стили и логику от админки? Мы можем разбить наше клиентское приложение на несколько. Здесь есть пример двух клиентских приложений — app и login. А это — они же в виде объектов на сервере.

login = require('../login')
main = require('../app')


Темплейты, стили и js для них будут соответственно в папках /views/app — /views/login, /styles/app — /styles/login, /lib/app — /lib/login. В браузер будет загружаться либо одно, либо другое приложение. Это удобно не только с точки зрения безопасности, но и с точки зрения уменьшения трафика.

Материалы по Derby

UPDATE: Подсказали что еще есть derby-passport, сделанный по мотивам derby-auth
  • +10
  • 6.4k
  • 8
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 8

    0
    Достаточно простые туториалы у Вас получаются.
    Если можно, хотел бы увидеть пример в такой связке: Derby + jQuery Mobile + Phonegap…
      +2
      Туториалы обычно отражают вопросы, которые задают мне люди, пытающиеся разобраться с Derby. Исходники нескольких приложений есть в открытом доступе. В то же время, чтобы описать пошагово создание большого приложения, нужно много времени и сил. И возможно получится целая книжка.

      Использовать jQuery Mobile с Derby вы можете прямо сейчас. Это не будет существенно отличаться от того, как вы используете jQuery Mobile с другими фреймворками.

      По поводу Phonegap были обсуждения тут. Смысл такой: в данное время это не возможно, ибо нельзя отделить клиентскую часть Derby от серверной. А в phonegap нужна только клиентская часть. В то же время с выходом Derby 0.6 это будет возможно. Нужно подождать пару месяцев.
      0
      >Только ко всей сущности сразу или ко всей коллекции. Это связано с ограничениями в share.js

      А нет понимания в какие примерно сроки планируется решить эту проблему? В гуглогруппах мне никто так и не ответил…
        0
        Вот тут поднял тему.
        Тут открыл issue для share.js
        0
        Официальный сайт Derby JS, пожалуйста, оставляйте ссылку в теле новости.
          0
          В конце каждой статьи есть ссылка на Материалы по Derby, там есть ссылки на все ресурсы, относящиеся к Derby, в том числе и на официальный сайт. Если чего-то там нету, пишите мне, я добавлю.
          0
          Если честно постоянно смущает фраза с официального сайта:
          Derby works great with only a single app, though developers may wish to create separate apps if only certain sets of pages are likely to be used together. For example, a project might have a separate desktop web app and mobile web app. Or a project might have an internal administration panel app and a public content app.

          Для меня важно, в частности, разъяснение причины такого утверждения и возможные негативные последствия. Наиболее логичной гипотезой является — возможные проблемы с Racer, при использовании каждой частью приложения разных БД.
            0
            Здесь не говорится о негативных последствиях. Потому что негативных последствий использования нескольких приложений нету. Дословный перевод такой:

            Дерби отлично работает с одним единственным приложением, хотя некоторые разработчики возможно захотят создать отдельные приложеня, если только определенные наборы страниц будут использоваться вместе. Например, проект может иметь отдельные десктопное веб приложение и мобильное веб приложение. Или проект может иметь внутрению админку и публичное приложение с контентом.

          Only users with full accounts can post comments. Log in, please.