Я создаю систему блогов с использованием angularJS и теперь пытаюсь создать поток авторизации ресурсов, который прост в использовании для определенных ресурсов. Например, у меня есть следующие состояния PROPOSALITEM
, PROPOSALITEM.VIEW
и PROPOSALITEM.EDIT
. PROPOSALITEM
— это родительские состояния, которые разрешают предложениеItem с помощью предоставленного :proposalId
для дочерних состояний. PROPOSALITEM.VIEW
— это состояние просмотра, которое позволяет всем пользователям получать к нему доступ, а PROPOSALITEM.EDIT
— это страница редактирования, которая должна разрешать доступ только proposal owner
.
Я обнаружил, что есть красивая структура для выполнения потока авторизации на основе role
в angularJS из этой статьи: " rel="nofollow">Методы аутентификации в приложениях AngularJS. Однако то, что мне сейчас нужно, основано на владении ресурсом, чтобы решить, может ли пользователь получить доступ к маршруту. И у меня есть много ресурсов, таких как модель proposal
, которые нужно проверять с авторизацией владельца. Все эти модели снабжены столбцом owner
. Есть ли какое-то общее решение для решения этой проблемы? (Я не хочу размещать код авторизации для каждой модели в отдельной части разрешения, потому что это сложно поддерживать)
/* Abstract states. Resolve proposalItem */
.state('PROPOSALITEM', {
abstract: true,
url: '/proposals/:proposalId',
template: '<ui-view/>',
resolve: {
proposalItem: function($stateParams, ProposalDataService) {
return ProposalDataService.getItem($stateParams.proposalId);
}
}
})
/* View states. Allows all users to access */
.state('PROPOSALITEM.VIEW', {
abstract: true,
url: '/view',
template: '...'
})
/* Edit states. Allows only the proposal owner */
.state('PROPOSALITEM.EDIT', {
url: '/edit',
template: '...',
resolve: {
proposalItem: function($q, proposalItem, UserDataService) {
var me = UserDataService.getMe();
// me: {
// _id: '1',
// name: '...'
// }
if (proposalItem.owner._id === me._id) {
// Authorized.
return proposalItem;
} else {
// Not authorized.
var deferred = $q.defer();
deferred.reject(ERROR_KEYS.NOT_AUTHORIZED);
return deferred.promise;
}
}
}
})