У меня есть приложение, в котором пользователи могут редактировать организации на разных «страницах».
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. Извиняюсь за мое английское написание слова «авторизованный».