4

認証にemberfireとtoriiを使用して、emberアプリ(ember 2.3.0を使用)を作成しています。ユーザーがログインすると、そのユーザーの uid が toriisessionオブジェクトで利用可能になります。モデルもありuser、テンプレート、ルートなどで現在のユーザーに関連する他のデータにアクセスしたいと考えています。

次のようなことを行うことで、これを単一のルートで機能させることができます。

let uid = this.get('session').get('uid');
this.store.findRecord('user', uid).then(user => {
  console.log(user.get('firstName'));
});

ただし、アクセスする必要があるルート/コントローラーごとにこれを記述する必要がないようにしたいと考えています。

誰かがこれを行うための最良の方法についてアドバイスできますか? サービスを使用する最良の方法は何ですか? その場合、セッション オブジェクトが使用可能になった後にサービス内のコードが実行されるようにするにはどうすればよいですか?

アップデート

次のソリューションでアプリケーションを動作させることができました。

firebase を使用してユーザーをログインするメソッドを作成する

ログイン動作を処理するための mixin を作成しました。これは、ログイン ページとサインアップ ページの両方で使用されます。

// Mixin to handle logging in

import Ember from 'ember';

export default Ember.Mixin.create({

  user: Ember.inject.service(),

  email: null,
  errorMsg: null,

  logInUser(email, password) {

    // logout existing user if any and then login new user
    this.get('session').close()
    .then(() => {
      // if already a user logged in
      this.firebaseLogin(email, password);
    })
    .catch(() => {
      // if no user logged in
      this.firebaseLogin(email, password);
    });
  },

  firebaseLogin(email, password) {
    this.get("session").open("firebase", {
       provider: 'password',
       email: email,
       password: password
     })
     .then((data) => {
       // If successful, fetch the user and transition to home page
       console.log("Successfully logged in as ", data);
       this.get('user').loadCurrentUser().then(() => {
         this.transitionToRoute('index');
       });

     })
     .catch(error => {
       this.set('errorMsg', error);
     });
  },

});

userサービスを作成する

userこれは、モデルを認証ユーザーに関連付けるために使用されます。

app/services/user.js

import Ember from 'ember';

export default Ember.Service.extend({

  store: Ember.inject.service(),
  session: Ember.inject.service(),

  currentUser: null,

  loadCurrentUser() {
    return new Ember.RSVP.Promise((resolve, reject) => {
      const uid = this.get('session').get('uid');
      if (!Ember.isEmpty(uid)) {
        return this.get('store').find('user', uid).then((user) => {
          this.set('currentUser', user);
          resolve();
        }, reject);
      } else {
        this.set('currentUser', null);
        resolve();
      }
    });
  }

});

userアプリケーションルートにサービスを注入

アプリケーション ルートは、アプリケーションが読み込まれるたびに呼び出されます (たとえば、ユーザーがページを更新したとき)。したがって、@Deovandski が彼の回答で述べたように、ユーザー アカウントをグローバルに使用できるようにするには、アプリケーション ルートに挿入する必要があります。

app/routes/application.js

import Ember from 'ember';

export default Ember.Route.extend({

  user: Ember.inject.service(),

  beforeModel() {
    return this.get("session").fetch()
    .then(() => {
      // Session retrieved successfully
      console.log('session retrieved');
      return this.get('user').loadCurrentUser();
    })
    .catch(() => {
      // Session could not be retrieved
      this.transitionTo('login');
    });
  }

});

user必要な場所にサービスを注入する

その後、次の方法で現在のユーザーにアクセスできます。

user: Ember.inject.service()
...
let currentUser = this.get('user').get('currentUser');
4

1 に答える 1

3

コメントのロックで述べたように、最善の策はサービスを使用することです。セッションにEmber-Simple-authを使用しています。これは、ログインしたユーザーをグローバルに保持する独自のカスタム セッションを実装する方法です。

Services/session-account.js

import Ember from 'ember';

const { inject: { service }, RSVP } = Ember;

export default Ember.Service.extend({
  session: service('session'),
  store: service(),

  loadCurrentUser() {
    return new RSVP.Promise((resolve, reject) => {
      const uid = this.get('session.data.authenticated.uid');
      if (!Ember.isEmpty(userId)) {
        return this.get('store').find('user', uid).then((user) => {
          this.set('user', user);
          resolve();
        }, reject);
      } else {
        resolve();
      }
    });
  }
});

アプリケーションルートへのサービスの注入

ユーザー アカウントをグローバルに使用できるようにするには、アプリケーション ルートにそれを挿入する必要があります。

const { service } = Ember.inject;
export default Ember.Route.extend(ApplicationRouteMixin, {
  session: service('session'),
  sessionAccount: service('session-account'),

  beforeModel() {
    return this.get('sessionAccount').loadCurrentUser();
  }

});

他のルート/コントローラーにサービスを注入する例

この例では、セッション アカウントを使用して、現在ログインしているユーザーと取得中のモデルを比較します。目的は、プロファイル情報を所有しているユーザーのみがプロファイル情報を編集できるようにすることです。

import Ember from 'ember';
const { service } = Ember.inject;

export default Ember.Route.extend ({
  session: service('session'),
  sessionAccount: service('session-account'),
  model: function() {
    return Ember.Object.create ({
      user: this.modelFor('user'),
      users: this.store.findAll('user')
    });
  },
  afterModel(model, transition) {
    if (model.user.get('id') === this.get('sessionAccount.user.id')) {
      // Allow Editing
    }
    else{
      this.transitionTo('index');
    }
  }
});
于 2016-03-15T08:20:10.667 に答える