Ответ 1
После некоторого рытья я думаю, что нашел работоспособное решение. Это сочетание вашего подхода с комментарием Джона Самвелла выше:
http://jonsamwell.com/url-route-authorization-and-security-in-angular/
и сообщение Eric Zou в блоге:
http://blog.ericzou.com/2013/05/03/using-angularjs-for-existing-rails-app/
Подводя итог:
- создать службу рельсов, которая отвечает cancan
abilities
текущего пользователя на стороне рельсов в формате json. Похоже, это то, что вы начали делать с вашим запросом GET для разрешений. Подобно этому (из блога Эрика) при вызове функции /abilities для пользователя:
{ "manage": { "User": true, "Post": false, ... }, "read": { "User": true, "Post": true ... }, "Update": { "User": true, "Post": false } ... }
Чтобы получить Способности для конкретного пользователя, вы бы сделали что-то вроде Ability.new(current_user)
в контроллере. Он возвращает объект с кучей правил. Правила имеют условия, которые позволят вам ограничить доступ к определенным сообщениям.
-
создать службу в angular, которая обрабатывает синтаксический анализ, который работает как уровень абстракции между тем, что вы получаете со стороны рельсов (определяет, можете ли вы получить доступ к маршруту или можете управлять, читать и т.д. конкретную модель (например, может? (: управлять, отправлять)). Вы можете сделать эту услугу настолько сложной, насколько хотите.
-
также создайте директиву в angular, чтобы обработать то, что нужно показать. Эрик предлагает использовать ng-show для этого, что хорошо, но очистить его чем-то похожим на предложение Jon:
<div access="post" access-type="read" access-options="options">Secret Post</div>
имеет смысл для меня.
Убедитесь, что вы ничего не обслуживаете с сервера, который не хотите, чтобы ваши пользователи видели, как они взломали ваш javascript, чтобы изменить их разрешения. Это не безопасность, это управление пользовательским интерфейсом.