Я работаю над веб-приложением Rails, и в настоящее время его используют около 20 пользователей.
Некоторые части приложения доступны только некоторым пользователям, поэтому у нас уже есть базовая структура авторизации, которую я реализовал с помощью плагина act_as_authenticated.
Права пользователей зависят от того, в каком отделе они работают, например, администрация имеет доступ ко всем частям приложения, в то время как бухгалтерия имеет доступ только к частям, связанным с учетом, а продажи имеют доступ только к частям, связанным с продажами и т. д.
С другой стороны, пользователи видят ссылки на действия, для которых у них недостаточно прав. Например, сотрудники отдела продаж видят ссылку на финансовые записи в главном меню, но когда они нажимают на нее, ничего не происходит. Это так, потому что AFAIK не существует эффективного способа запрашивать пользовательские привилегии с использованием act_as_authenticated.
Я хочу изменить это двумя способами:
Я хочу ввести более детальную авторизацию. В настоящее время авторизация осуществляется на уровне контроллера. Я хочу сделать это на уровне действия или модели. Например, я хочу, чтобы сотрудники отдела продаж могли создавать и обновлять платежи, но не удалять их.
Я хочу иметь возможность эффективно запрашивать пользовательские привилегии, чтобы я мог удалить ненужные (и сбивающие с толку) ссылки из интерфейса.
Как вы думаете, какой самый элегантный способ реализовать это?
Ответы, специфичные для Rails, не нужны, я просто хочу знать, как это должно быть реализовано в приложении, управляемом данными.
Наконец, вот как это реализовано в настоящее время:
def authorized?
current_user.role.foo? or current_user.role.bar?
end
А вот моя первоначальная идея, которая, я думаю, не лучший способ решить эту проблему:
+------------+------------+---------+
| department | controller | action |
+------------+------------+---------+
| accounting | payments | index |
| accounting | payments | new |
| accounting | payments | create |
| accounting | payments | edit |
| accounting | payments | update |
| accounting | payments | destroy |
| sales | payments | new |
| sales | payments | create |
| sales | payments | edit |
| sales | payments | update |
+------------+------------+---------+
или
+------------+----------+-------+--------+------+--------+--------+
| department | model | list | create | read | update | delete |
+------------+----------+-------+--------+------+--------+--------+
| accounting | payments | TRUE | TRUE | TRUE | TRUE | TRUE |
| sales | payments | FALSE | TRUE | TRUE | TRUE | FALSE |
+------------+----------+-------+--------+------+--------+--------+