ABAC с keycloak - Использование атрибутов ресурса в политике

Чего я пытаюсь достичь

Защитите ресурс в Keycloak с помощью такой политики:

if (resource.status == 'draft') $evaluation.grant(); 
else $evaluation.deny();

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

Что я пробовал

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

Пока что с обоими подходами мне ничего не удавалось. Честно говоря, меня поразила терминология, используемая в службах авторизации.

Вопрос Как я могу использовать атрибуты экземпляра ресурса при определении политики в keycloak?


person dubes    schedule 24.10.2016    source источник
comment
Похоже, это будет в Keycloak версии 4. Уже доступно в 4.0.0.Beta1 (см. проблемы .jboss.org / browse / KEYCLOAK-6529). Я сам не пробовал   -  person jadkik94    schedule 20.04.2018


Ответы (2)


Я решил эту проблему в Keycloak 4.3, создав политику JavaScript, потому что политики атрибутов не существуют (пока). Вот пример кода, с которым я работал (обратите внимание, что значения атрибутов представляют собой список, поэтому вам нужно сравнить с первым элементом в списке):

var permission = $evaluation.getPermission();
var resource = permission.getResource();
var attributes = resource.getAttributes();

if (attributes.status !== null && attributes.status[0] == "draft") {
    $evaluation.grant();
} else {
    $evaluation.deny();
}
person dave_erie    schedule 15.10.2018
comment
Не могли бы вы пояснить, откуда взялось значение атрибута status? Это атрибут, который каким-то образом установлен клиентом или сервером, запрашивающим доступ к нему? Если да, то как вы можете пересылать такую ​​информацию от клиента / серверной части в качестве атрибута ресурса? - person Blink; 04.04.2019
comment
Привет, Дэйв, я знаю, что он старый, но я тоже сталкиваюсь с тем же вопросом. Как вы получили статусный атрибут? - person NumeroUno; 20.06.2020

В настоящее время нет возможности делать то, что вы хотите. Класс ResourceRepresentation имеет только поля (id, name, uri, type, iconUri, owner). Таким образом, вы можете использовать владельца для определения владельца на примере Keycloak. Я видел поток, в котором говорится о добавлении дополнительных атрибутов ресурсов, но не видел для этого Keycloak JIRA.

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

var context = $evaluation.getContext();
var attributes = context.getAttributes();
var fooValue = attributes.getValue("fooAttribute");

if (fooValue.equals("something")) 
{
   $evaluation.grant();
}
person Yev    schedule 26.06.2017
comment
Не могли бы вы подробно рассказать, как установить контекстные атрибуты во время выполнения? Я не нашел параметра для его установки на keycloak.org/docs/latest/ authorization_services / - person HFX; 14.10.2019