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

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

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

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

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

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

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

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

1 ответ

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

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

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

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

В 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. Используйте Multiple Decision Profile - это часть набора дополнительных профилей XACML 3.0, или
  2. Используйте подход обратного запроса - это относится только к аксиоматике. Я не уверен, что WSO2 поддерживает это.

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

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

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

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

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

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

  • Какие машины может увидеть Алиса?

Вместо ответа, являющегося разрешением или запрещением, ответ является выражением фильтра, таким как оператор SQL, например

  • ВЫБЕРИТЕ ИД ОТ АВТОМОБИЛЕЙ, ГДЕ НАЗНАЧЕН SP='Алиса';

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

Другие вопросы по тегам