5

django-rest-framework バックエンドで ember-simple-auth をセットアップしようとしていますが、ユーザーをセッションに保存する際に問題が発生しています。テンプレートで次のようなことができる必要があります。

<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を与えるように変更しました。sessionuser

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空の文字列は、オブジェクトではなく Promise が返されたためだと思いますが、どうすれば解決できますか?
4

2 に答える 2

14

@marcoow の応答にタグを付けるには、Ember CLI でそれを実装する方法を次に示します。

index.html:

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

初期化子/customize-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);
  }
};
于 2014-08-14T22:41:29.907 に答える
4

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',
}
于 2014-07-26T08:29:33.940 に答える