Session Ember SimpleAuth验证对受保护资源的访问

Session Ember SimpleAuth验证对受保护资源的访问,session,ember.js,ember-simple-auth,Session,Ember.js,Ember Simple Auth,我有一个应用程序,用户可以在不同的“页面”中编辑组织 App.Router.map(function() { this.resource('organisation', {path: '/:orgname'}, function () { this.route('foo'); this.route('bar'); }); }); 我希望用户能够查看任何组织,但如果用户对该组织拥有管理权限,则各个页面应可编辑 基于服务器处理的一些复杂逻辑,组织是可编辑的。用户模型有一个O

我有一个应用程序,用户可以在不同的“页面”中编辑组织

App.Router.map(function() {
  this.resource('organisation', {path: '/:orgname'}, function () {
    this.route('foo');
    this.route('bar');
  });
});
我希望用户能够查看任何组织,但如果用户对该组织拥有管理权限,则各个页面应可编辑

基于服务器处理的一些复杂逻辑,组织是可编辑的。用户模型有一个Organizations属性来反映这些管理权限。这反映在组织对象中。在服务器上,它是一个多对多表加上一些其他逻辑

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}}
{{#如果编辑全名}
{{view Ember.TextField valueBinding=“model.fullname”placeholder=“Full name”}
{{else}
{{{#if model.fullname}
{{model.fullname}
{{else}
没有提供姓名。。。
{{/if}
{{{#如果session.isAuthenticated}
{{/if}
{{/if}
键是
{{{if session.isAuthenticated}
语句。这确保用户只有在登录后才能访问受限功能

到目前为止一切都很正常(我想)

但是,我希望能够询问我的会话当前用户是否有权访问相关组织。因此,我想将
{{{if session.isAuthenticated}}
更改为
{{{{if session.isAuthenticated}
,并让它根据我的数据检查当前模型/路由

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


请注意,我对“授权”的英文拼写表示歉意。

您希望从每个组织进行计算,以便在每种型号的基础上准确无误。所以改变

{{#if session.isAuthenticated}}

然后,您可以直接从模型定义开始计算(这可能不适合您的异步情况,但可能是可行的),如下所示:

或者您可以从
itemController
中执行此操作(对于异步,我将如何执行此操作)。这样做的逻辑应该很简单。检查当前用户是否包含在组织的用户集合中。从computed属性返回布尔值。将该属性绑定到
session.isAuthenticated
,然后绑定到
用户。@each.content
或组织中可能实时更改的任何内容


希望有帮助

我认为这是一个很好的建议,尽管再详细一点会很有用。但是,我的模型已更改,因此我将重新提交一个新问题。
{{#if model.userCanAdminister}}