Учетная запись Rails 3 со многими пользователями, ограничить доступ к данным - PullRequest
3 голосов
/ 11 июля 2011

Мне интересно, как лучше структурировать аутентификацию / авторизацию в моем приложении. Я хочу иметь

  • много учетных записей компаний, возможно, с использованием поддоменов

  • учетная запись имеет много пользователей

  • и пользователи могут получить доступ только к тем записям, которые были созданы самим собой или другим пользователем с той же учетной записью.

Проведенное мною исследование предлагает множество смешанных и подходящих идей для сочетания devise / cancan / authlogic необычным и замечательным образом, но я пока не нашел ничего, что показало бы мне лучший способ ограничить доступ пользователей к данным. в той же модели.

Так, например:


Счет 1: Евразия

Пользователь 1: Боб

Пользователь 2: Джим


Счет 2: Eastasia

Пользователь 1: Дейв

Пользователь 2: Алан


Isbn 1: account_id равен 1

Isbn 2: account_id равен 2


Как мне удостовериться, что Боб не может получить доступ к Isbn 2 или нет?

/// обновление Конечно, теперь я написал это, мой google fu включился, и я нашел readme от RyanB для CanCan 2.0 , который кажется идеальным:

> Ресурсы

Что делать, если вам нужно изменить авторизацию на основе модели атрибуты? Вы можете сделать это, передав хэш условий как последний аргумент может. Например, если вы хотите разрешить доступ только одному для проектов, которыми он владеет, вы можете установить опцию: user_id.

Ответы [ 3 ]

5 голосов
/ 11 июля 2011

Я бы предложил использовать CanCan для авторизации.

Ваша модель способностей будет выглядеть примерно так:

can :manage, :isbn do |isbn|
  isbn.account == current_user.account
end

Тогда вы можете использовать условные выражения, такие как can? :manage, @post в вашем контроллере / представлениях.

2 голосов
/ 11 июля 2011

Вы должны взглянуть на https://github.com/stffn/declarative_authorization Я думаю, что вы делаете именно так, как вы просите (вы можете ограничить доступ к определенным записям)

, поэтому в вашем примере вы можете установитьдобавьте авторизацию примерно так:

has_permission_on :isbn do 
    to :manage
    if_attribute :account_id => is_in {user.account_ids}
end
0 голосов
/ 17 января 2013

Вы смотрели на XACML? Это основанная на политике декларативная структура авторизации. Это также стандарт от OASIS.

С XACML вы можете взять любые необходимые вам атрибуты (атрибуты пользователя, ресурса, действия или контекста) и выразить вариант использования, который у вас есть.

Ваше первоначальное требование было

пользователи могут получить доступ только к тем записям, которые были созданы ими или другим пользователем с той же учетной записью.

В XACML это станет следующей политикой:

Пользователь может получить доступ к записи, если и только если record.owner == user.id ИЛИ user.accountId == record.accountId

Вот и все! Архитектура XACML определяет точку реализации политики (PEP), которая является компонентом, который защищает ваше приложение / данные и отправляет запрос авторизации в точку принятия политики (PDP). PEP говорит: «Может ли Алиса получить доступ к записи № 123?» PDP проверяет идентификатор учетной записи Алисы и идентификатор учетной записи, а также владельца. В конечном итоге PDP возвращает «Разрешение» или «Запретить».

НТН

...