Ember SimpleAuth аутентифицирует доступ к защищенным ресурсам

У меня есть приложение, в котором пользователи могут редактировать организации на разных «страницах».

App.Router.map(function() {
  this.resource('organisation', {path: '/:orgname'}, function () {
    this.route('foo');
    this.route('bar');
  });
});

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

Организации доступны для редактирования на основе некоторой сложной логики, обрабатываемой сервером. Модель пользователя имеет атрибут организации, чтобы отразить эти права администратора. Это отражено в объекте организации. На сервере это таблица «многие ко многим» плюс некоторая другая логика.

App.User = DS.Model.extend({
  primaryKey: 'username',
  fullname: DS.attr('string'),
  username: DS.attr('string'),
  organisations: DS.hasMany('organisation', {async: true})
});

App.Organisation = DS.Model.extend({
  primaryKey: 'orgname',
  orgname: DS.attr('string'),
  fullname: DS.attr('string', {defaultValue: 'Unnamed Organisation'}),
  description: DS.attr('string'),
  users: DS.hasMany('user', {async: true}),
});

Я использую Ember SimpleAuth для аутентификации через страницу входа и для авторизации запросов к моему API. Я использую пользовательский сеанс для загрузки данных для аутентифицированного пользователя.

var CustomSession = SimpleAuth.Session.extend({
  user: function() {
    var username = this.get('username');
    if (!Ember.isEmpty(username)) {
      return this.container.lookup('store:main').find('user', username);
    }
  }.property('username')
});

У меня есть такой контроллер, который позволяет редактировать атрибуты в моем шаблоне.

App.OrganisationController = Ember.Controller.extend({
  actions: {
    ToggleEditFullname: function() {
      this.set('editingFullname', !this.get('editingFullname'));
    },
    save: function() {
      this.set('editingFullname', false);
      return true;
    }
  }
});

Итак, в моем шаблоне я делаю что-то вроде этого...

  {{#if editingFullname}}
    {{view Ember.TextField valueBinding="model.fullname" placeholder="Full name"}}
    <a href="#"><i {{action 'ToggleEditFullname'}} class="fa fa-times" title="cancel"></i></a>
  {{else}}
    {{#if model.fullname}}
      {{model.fullname}}
    {{else}}
      No name provided...
    {{/if}}
    {{#if session.isAuthenticated}}
      <a href="#"><i {{action 'ToggleEditFullname'}} class="fa fa-pencil" title="edit name"></i></a>
    {{/if}}
  {{/if}}

Ключевым является оператор {{#if session.isAuthenticated}}. Это гарантирует, что пользователи получат доступ к функциям с ограниченным доступом, только если они вошли в систему.

Пока все довольно нормально (я так думаю).

Тем не менее, я хочу иметь возможность спросить мой сеанс, авторизован ли текущий пользователь для доступа к рассматриваемой организации. Поэтому я хотел бы изменить {{#if session.isAuthenticated}} на {{#if session.isAuthorised}} и проверить текущую модель/маршрут по моим данным.

Как мне лучше всего это сделать? Есть ли лучшая альтернатива? Как защитить ресурсы по отдельности?

P.S. Извиняюсь за мое английское написание слова «авторизованный».


person Graeme Stuart    schedule 29.07.2014    source источник


Ответы (1)


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

{{#if session.isAuthenticated}}

to

{{#if model.userCanAdminister}}

Затем вы можете вычислить это прямо из определения модели (это, вероятно, не подходит для вашего асинхронного случая, но может сработать), как показано здесь: http://emberjs.com/guides/models/defining-models/#toc_defining-attributes

Или вы можете сделать это из itemController (как я бы сделал это для асинхронности). Логика для этого должна быть довольно простой. Проверьте, содержится ли текущий пользователь в коллекции пользователей организации. Возвращает логическое значение из вычисляемого свойства. Привяжите это свойство к session.isAuthenticated, а затем к [email protected] или к тому, что может измениться в организации в режиме реального времени.

Надеюсь, это поможет!

person Matthew Blancarte    schedule 29.07.2014
comment
Я думаю, что это хороший совет, хотя немного больше деталей было бы полезно. Однако моя модель изменилась, поэтому я повторно задаю новый вопрос. - person Graeme Stuart; 07.08.2014