Я работаю над веб-приложением Rails, и в настоящее время он используется примерно 20 пользователями.Лучший способ реализовать мелкозернистую авторизацию для веб-приложения?
Некоторые части приложения доступны только некоторым пользователям, поэтому у нас уже есть базовая структура авторизации, которую я реализовал с помощью плагина act_as_authenticated.
Права пользователей зависят от того, в каком отделе они работают, например, администрация имеет доступ ко всем частям приложения, а учет только имеет доступ к частям, связанным с бухгалтерским учетом, а продажи имеют доступ только к связанным с продажами детали и т. д.
С другой стороны, пользователи видят ссылки на действия, для которых у них есть недопустимые привилегии. Например, те, кто находится в отделе продаж, видят ссылку на финансовые записи в главном меню, но когда они нажимают на нее, ничего не происходит. Это связано с тем, что AFAIK не имеет эффективного способа запроса прав пользователя с помощью act_as_authenticated.
Я хочу изменить это двумя способами:
Я хочу представить более мелкозернистой авторизации. В настоящее время авторизация выполняется на уровне контроллера. Я хочу сделать это на уровне действия или модели. Например, я хочу, чтобы сотрудники отдела продаж могли создавать и обновлять платежи, но не удалять их.
Я хочу иметь возможность эффективно запрашивать пользовательские права, поэтому я могу удалить ненужные (и запутывающие) ссылки из интерфейса.
Как вы считаете, самый элегантный способ реализовать это?
Ответы на конкретные вопросы не нужны, я просто хочу знать, как это должно быть реализовано в приложении, управляемом данными.
Наконец, вот как она реализована в настоящее время:
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 | +------------+----------+-------+--------+------+--------+--------+
У меня уже есть таблица отделов и таблица users_departments. Я упростил примерную таблицу для краткости. – 2008-11-11 12:47:42