我有一个应用程序,用户可以在各种“页面”中编辑组织。
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}}
,并根据我的数据检查当前的模型/路线。
我怎样才能做到最好?还有更好的选择吗?我如何单独保护资源?
P.S。为我的英文拼写道歉,授权&#39;。
答案 0 :(得分:1)
您希望从每个组织进行计算,以便在每个模型的基础上准确。所以改变
{{#if session.isAuthenticated}}
到
{{#if model.userCanAdminister}}
然后你可以直接从模型定义计算出来(这可能不适合你的异步情况,但可能是可行的),如下所示:http://emberjs.com/guides/models/defining-models/#toc_defining-attributes
或者你可以从itemController
(我如何为异步做)来做到这一点。这个逻辑应该非常简单。检查当前用户是否包含在组织的用户集合中。从计算属性返回一个布尔值。将该属性绑定到session.isAuthenticated
然后users.@each.content
或组织中可能发生的任何实时更改。
希望有所帮助!