Мой предвзятый ответ: да, вы должны :-) (я работаю на Аксиоматика , и все, что мы делаем, это PBAC / ABAC и делали это в течение 15 лет).
Обратите внимание, чтоPBAC и ABAC в этом контексте одинаковы.PBAC на самом деле гораздо более старая концепция.В прошлом мы использовали политики во многих местах, например, контроль доступа к сети или SDDL.
Основное преимущество контроля доступа на основе атрибутов ( abac ) заключается в том, что оно дастВы можете со временем адаптировать свои политики контроля доступа без необходимости переписывать ваше приложение.По сути, вы отделяете / экстернализуете авторизацию из приложения.
Ниже показан базовый архитектурный поток в ABAC, посредством которого компонент (PEP) перехватывает бизнес-поток и преобразует его в поток авторизации ( Can Aliceпросмотреть запись 123? ).
Политики могут быть записаны в xacml или alfa ,Я предпочитаю последнее, так как его синтаксис очень легкий (подробнее на Wikipedia ).
Например, вы можете написать:
namespace com.acme{
/**
* Tutorial 101 - a flat approach using 4 rules
*/
policyset recordsAccess{
apply firstApplicable
/**
* Records access control
*/
policy records{
target clause object.objectType == "record"
apply firstApplicable
/**
* R1 - A manager can view any records
*/
rule managersView{
target clause user.role == "manager" and action.actionId == "view"
permit
}
/**
* R2 - An employee can view a record in their own department
*/
rule employeesView{
target clause user.role == "employee" and action.actionId == "view"
condition user.department == record.department
permit
}
/**
* R3 - An employee can edit a record they own, if it is in draft mode
*/
rule employeeEdit{
target clause user.role == "employee" and action.actionId == "edit" and record.status == "draft"
condition com.acme.record.owner == com.acme.user.employeeId
permit
}
/**
* R4 - A manager can publish a record if the record is in final
* mode and it belongs to a employee below that manager.
*/
rule managerPublish{
target clause user.role == "manager" and action.actionId == "publish"
condition stringIsIn(stringOneAndOnly(com.acme.record.owner),com.acme.user.subordinate)
permit
}
}
}
}