Как использовать XACML и PIP в реальном приложении?

Как охватить следующий сценарий с использованием XACML (с WSO2 PDP) и PIP (при необходимости).

В приложении «Подержанный автомобиль», в определенном месте, продавцу разрешено просматривать и обновлять цену автомобиля. Они могут просматривать только автомобили, которые закреплены за ними.

Теперь из перспективы xacml мы можем создать политику для роль продавца и в зависимости от местоположения скрыть определенные меню.

Но что делать с методом getCarDetails(Object User){...}?

здесь на основе UserID (продавец) мы покажем список.

Как спроектировать это со спецификациями xacml?

Насколько я понимаю, это так: мы можем использовать spring- security и добавьте к этому методу роль продавца. Но это только ограничит других пользователей от разных ролей. оттуда я запутался, должны ли мы использовать вызов базы данных в соответствии с нашими традиционными приложениями с идентификатором пользователя и получить список автомобилей, или есть способ получить подробный доступ с помощью xacml?


person Budhh    schedule 22.12.2014    source источник
comment
Куда относится ваш вопрос. Пипсы приходят?   -  person David Brossard    schedule 22.12.2014


Ответы (1)


Ваш вопрос содержит 2 вопроса:

  1. Как мне смоделировать мою политику?
  2. Как защитить свое приложение? (Исполнение решений)

Прежде всего, давайте смоделируем вашу политику в ALFA:

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

В АЛЬФА это становится:

namespace com.axiomatics{
    /**
     * A sales person can view a car if and only if the car's assigned salesperson 
     * identifier is equal to the requesting user's identity.
     */
    policy viewCars{
        target clause user.role=="sales person" and actionId == "view" and objectType=="car"
        apply firstApplicable
        /**
         * 
         */
        rule allowAssignedUser{
            permit
            condition car.assignedSalesPerson==user.identifier
        }
    }
}

Это ваше моделирование отсортировано.

Теперь, что касается второго вопроса: как мне обеспечить авторизацию? Я бы возражал против смешивания ролей, управляемых политиками Spring Security и XACML, если вы их правильно не задокументируете.

Есть два подхода, которые вы можете использовать.

  1. Используйте профиль множественного решения — это часть набора дополнительных профилей XACML 3.0 или
  2. Используйте подход обратного запроса — он характерен только для аксиоматики. Я не уверен, что WSO2 поддерживает это.

Профиль множественного принятия решений (MDP) определяет, как вы можете отправлять несколько запросов на авторизацию, написанных в xacml в точку принятия решения о политике (PDP) с помощью одного запроса. Это сэкономит вам несколько поездок туда и обратно. Ответ, который вы получите, будет содержать столько решений, сколько запросов на авторизацию в исходном отправленном запросе. Вы экономите время на транспортировке и оценке. Используйте MDP, когда вы знаете, сколько элементов вы хотите защитить, и когда это число составляет от 1 до 1000, но не больше (хотя, конечно, всегда стоит попробовать). Подробнее о MDP можно прочитать в блоге Axiomatics. . В вашем случае поток будет следующим:

  1. Звоните getCarDetails(Object user).
  2. Вызовите базовую базу данных, чтобы получить все автомобили
  3. Позвоните в PDP в режиме MDP для всех найденных записей, чтобы получить решение.
  4. Вернуть только те записи, на которые у вас было разрешение

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

Подход обратного запроса интересен, хотя и специфичен для аксиоматики. Он определяет новый интерфейс поверх XACML PDP, который позволяет запрашивать механизм авторизации обратным способом. Вместо того, чтобы спрашивать:

  • Может ли Алиса просмотреть машину №123?

Обратный запрос позволяет вам спросить

  • Какие автомобили может просматривать Алиса?

Вместо ответа «Разрешить» или «Запретить» ответ представляет собой выражение фильтра, такое как оператор SQL, например.

  • ВЫБЕРИТЕ ИДЕНТИФИКАТОР ИЗ автомобилей, ГДЕ назначен SP='Alice';

Все, что вам нужно сделать, это использовать оператор SQL для вашей базы данных, чтобы запросить ее и вернуть только выделенные данные. Это работает независимо от того, сколько данных у вас есть в вашей базе данных. Вы можете найти дополнительную информацию о ARQ SQL через этот веб-семинар.

person David Brossard    schedule 22.12.2014
comment
Спасибо! wso2 не поддерживает RQuery Я хотел бы понять, есть ли у вас копия исходной базы данных на уровне PDP? Иначе как мы можем получить список автомобилей, назначенных Алисе? Потому что автомобили будут динамическими для приложения, например. на данный момент 10 автомобилей закреплены за пользователем Алиса. внезапно супервизор добавит в свой список еще 20 автомобилей, которые будут в базе данных уровня приложения. Затем, как эти другие 20 автомобилей будут автоматически назначены в политике на уровне PDP, пока у них также не будет этой самой последней информации. Я могу сделать некоторую ошибку в понимании. также если вы можете поставить политику, созданную альфа-кодом - person Budhh; 23.12.2014
comment
Можете ли вы сделать это еще одним вопросом SO, чтобы я мог ответить? - person David Brossard; 23.12.2014
comment
Еще раз спасибо, Дэвид, я задал вопрос здесь [stackoverflow.com/questions/27626555/ - person Budhh; 23.12.2014