Как сохранить пользователя в сеансе

Я пытаюсь настроить ember-simple-auth с помощью бэкенда django-rest-framework, но у меня возникают проблемы с сохранением пользователя в сеансе. Я должен иметь возможность сделать что-то подобное в своих шаблонах:

<h2>Welcome back, {{session.user}}</h2>

Итак, следуя нескольким руководствам, которые я нашел, у меня работает аутентификация и авторизация, поэтому я могу получить действительный токен и использовать его в запросах. Чтобы получить пользователя в сеансе, я изменил App.CustomAuthenticator.authenticate так, чтобы при возврате токена имя пользователя также сохранялось в сеансе:

authenticate: function(credentials) {
    var _this = this;
    return new Ember.RSVP.Promise(function(resolve, reject) {
        Ember.$.ajax({
            url: _this.tokenEndpoint,
            type: 'POST',
            data: JSON.stringify({username: credentials.identification, password: credentials.password }),
            contentType: 'application/json'
        }).then(function(response) {
            Ember.run(function() {
                resolve({
                    token: response.token,
                    username: credentials.identification
                });
            });
        }, function(xhr, status, error) {
            var response = JSON.parse(xhr.responseText);
            Ember.run(function() {
                reject(response.error);
            });
        });
    });
},

Затем я изменил Application.intializer, чтобы дать session свойство user:

Ember.Application.initializer({
    name: 'authentication',
    before: 'simple-auth',
    initialize: function(container, application) {
        // register the custom authenticator and authorizer so Ember Simple Auth can find them
        container.register('authenticator:custom', App.CustomAuthenticator);
        container.register('authorizer:custom', App.CustomAuthorizer);
        SimpleAuth.Session.reopen({
            user: function() {
              var username = this.get('username');
              if (!Ember.isEmpty(username)) {
                return container.lookup('store:main').find('user', {username: username});
              }
            }.property('username')
        });
    }
});

Однако при отображении {{session.user.username}} это просто пустая строка. Мои вопросы:

  1. Действительно ли это лучший способ назначить пользователя сеансу? Мне это кажется корявым, но я не вижу ничего лучше.
  2. Я предполагаю, что пустая строка связана с тем, что возвращается обещание, а не объект User, так как мне это разрешить?

person aquavitae    schedule 23.07.2014    source источник
comment
На данный момент это способ сделать это на самом деле. В следующем выпуске Ember Simple Auth это станет проще, так как вы сможете указать свой собственный класс сеанса и больше не придется повторно открывать существующий сеанс.   -  person marcoow    schedule 23.07.2014
comment
Хорошо, тогда как мне получить настоящий User?   -  person aquavitae    schedule 23.07.2014
comment
проверьте пример в репозитории, который делает именно то, что вы хотите: github.com/simplabs/ember-simple-auth/blob/master/examples/   -  person marcoow    schedule 23.07.2014
comment
Я уже смотрел на это - вот откуда я взял идею. Однако в примере find присваивается идентификатор. В моем случае он используется для поиска, т.е. .find('user', {username: username}).   -  person aquavitae    schedule 23.07.2014
comment
Это должно быть то же самое - только результаты 2 разных запросов к REST API. Единственное, что может отличаться, это то, что ваш .find может возвращать массив, тогда как .find с идентификатором в примере возвращает запись напрямую. Хотя это только предположение - не пробовал.   -  person marcoow    schedule 23.07.2014


Ответы (2)


В выпуске 0.6.4 теперь вы можете указать собственный класс сеанса без необходимости повторного открытия, см. примечание к выпуску здесь: https://github.com/simplabs/ember-simple-auth/releases/tag/0.6.4. Вот как это работает:

App.CustomSession = SimpleAuth.Session.extend({
  account: function() {
    var accountId = this.get('account_id');
    if (!Ember.isEmpty(accountId)) {
      return this.container.lookup('store:main').find('account', accountId);
    }
  }.property('account_id')
});
…
container.register('session:custom', App.CustomSession);
…
window.ENV['simple-auth'] = {
  session: 'session:custom',
}
person marcoow    schedule 26.07.2014

Чтобы пометить ответ @marcoow, вот как реализовать его в Ember CLI:

индекс.html:

window.ENV['simple-auth'] = {
  authorizer: 'simple-auth-authorizer:devise',
  session: 'session:withCurrentUser'
};

инициализаторы/настроить-session.js:

import Session from 'simple-auth/session';

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

export default {
  name: 'customize-session',
  initialize: function(container) {
    container.register('session:withCurrentUser', SessionWithCurrentUser);
  }
};
person michael    schedule 14.08.2014
comment
Спасибо за окончательную реализацию. У меня была точно такая же ситуация. Большое спасибо. - person Tushar Patel; 05.09.2014
comment
Сегодня это может помочь: каждый маршрут"> stackoverflow.com/questions/30872684/ - person Toni; 03.08.2015