使用ember简单身份验证进行身份验证后的用户加载

时间:2019-10-23 16:20:01

标签: ember.js ember-simple-auth

我使用ember简单身份验证来验证我的用户。 除非用户刚刚登录,否则它运行正常。

我有一个帮忙询问当前用户:

import Helper from '@ember/component/helper';
import { inject as service } from '@ember/service';

export default Helper.extend({
  currentUser: service('current-user'),
  compute([feature,currentUser]) {
    let role = currentUser.get('user.role')

Helper用于嵌入application.hbs模板中的模板

{{#if (permission-for "users" currentUser)}}
  <li>{{#link-to 'users'}}<i class="fa fa-user"></i> <span>Clients</span>{{/link-to}}</li>
  {{/if}}

当前用户服务是doc:https://github.com/simplabs/ember-simple-auth/blob/master/guides/managing-current-user.md#loading-the-user-with-its-id

中该服务的重复项

我的application.js也使用同一指南中的代码。

根据我的尝试,sessionAuthenticated开始运行,在await this._loadCurrentUser();期间执行了助手,并完成了运行sessionAuthenticated

发生的事情是我想要的用户属性未定义,因此无法根据用户的角色显示界面元素。

如何解决此问题?

针对相关问题进行编辑:应该如何在模板中使用ember simple auth来确定User是否应该看到界面的某些部分?例如菜单选项。

2 个答案:

答案 0 :(得分:2)

您的方法遇到的问题是,辅助程序正在同步执行,并且没有以重新计算的方式“监视” currentUser服务。使用计算属性执行所需操作会容易得多:

controllers / application.js

  currentUser: service(),

  hasPermissionForUsers: computed("currentUser.user", function() {
    const user = this.get("currentUser.user");

    if (! user) return false;

    return user.get("role") === "users"; // taking a random guess at what your helper does here
  })

加载用户后,此属性现在将重新计算:

application.hbs

  {{#if hasPermissionForUsers}}
    <li>{{#link-to 'users'}}<i class="fa fa-user"></i> <span>Clients</span>{{/link-to}}</li>
  {{/if}}

如果必须使用帮助器,它是可行的,但效果并不理想。之所以不那么优雅,是因为助手无法访问相同的上下文,因此重新计算更加困难。您可以执行以下操作:

import Helper from '@ember/component/helper';
import { inject as service } from '@ember/service';
import { run } from '@ember/runloop';
import { addObserver, removeObserver } from '@ember/object/observers';

export default Helper.extend({

  currentUser: service(),

  willDestroy() {
    this._super(...arguments);
    const container = this.get('_container');
    removeObserver(container, 'currentUser.user', this, this.update);
  },

  compute([feature, container]) {
    addObserver(container, 'currentUser.user', this, this.update);
    this.set('_container', container); // used for cleanup

    const user = this.get('currentUser.user');

    if (! user) return false;

    return user.get('role') === feature;
  },

  update() {
    run.once(this, this.recompute);
  }
});

然后像这样使用它:

application.hbs

{{#if (permission-for "users" this)}}
  <li>{{#link-to 'users'}}<i class="fa fa-user"></i> <span>Clients</span>{{/link-to}}</li>
{{/if}}

答案 1 :(得分:1)

首先,我建议不要将currentUser服务传递给帮助程序。

接下来,您可以在加载用户之后让助手重新计算:

export default Helper.extend({
  currentUser: service('current-user'),
  init() {
    if(!this.currentUser.user) {
      this.currentUser.runAfterLoaded.push(() => this.recompute());
    }
  },
  compute([feature]) {
    if(!this.currentUser.user)
      return false;
    }
    let role = this.currentUser.get('user.role')
    ...
    return ..;
  }
});

您还希望在this.runAfterLoaded.forEach(x => x())之后将load()添加到current-user服务的this.set('user', user);函数中,并将this.set('runAfterLoaded', [])添加到{{ 1}}钩子。


另一种可能性是构建一个混入,将其添加到init之后的相关路由中,以确保将加载当前用户。