ユーザーがさまざまな「ページ」で組織を編集できるアプリがあります。
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}}
そこで、 toを変更し{{#if session.isAuthorised}}
て、現在のモデル/ルートを自分のデータと照合させたいと思います。
これを行うにはどうすればよいですか?より良い代替手段はありますか?リソースを個別に保護するにはどうすればよいですか?
PS「承認済み」の英語のスペルについてお詫び申し上げます。