【问题标题】:Ember SimpleAuth authenticate access to protected resourcesEmber SimpleAuth 验证对受保护资源的访问
【发布时间】:2014-07-29 12:58:18
【问题描述】:

我有一个应用程序,用户可以在其中编辑各种“页面”中的组织。

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}} 并让它根据我的数据检查当前模型/路线。

我怎样才能最好地做到这一点?有更好的选择吗?如何单独保护资源?

附:为我的“授权”英文拼写道歉。

【问题讨论】:

    标签: session ember.js ember-simple-auth


    【解决方案1】:

    您希望从每个组织进行计算,以便每个模型都准确。所以改变

    {{#if session.isAuthenticated}}
    

    {{#if model.userCanAdminister}}
    

    然后您可以直接从模型定义中计算出来(这可能不适合您的异步情况,但可能可行),如下所示:http://emberjs.com/guides/models/defining-models/#toc_defining-attributes

    或者您可以通过itemController 进行操作(我将如何为异步进行操作)。这样做的逻辑应该很简单。检查当前用户是否包含在组织的用户集合中。从计算属性返回一个布尔值。将该属性绑定到 session.isAuthenticated,然后绑定到 users.@each.content 或组织中可能发生的任何实时变化。

    希望有帮助!

    【讨论】:

    • 我认为这是一个很好的建议,尽管更详细一点会很有用。但是,我的模型发生了变化,所以我重新提交了一个新问题。
    猜你喜欢
    • 2016-12-23
    • 2013-10-22
    • 2016-11-26
    • 1970-01-01
    • 2018-07-17
    • 2015-09-05
    • 2018-07-22
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多