В дополнение к тому, что сказал Хенк, вы можете использовать внешнюю платформу, основанную на политике, такую как xacml или alfa . Конечный результат похож на то, что написал Хенк, но он основан на политике, а не на коде (используя IAuthorizationRequirement
).
Политика выглядит как старый английский.
policyset documents{
target clause objectType == "document"
apply firstApplicable
policy employees{
target clause user.role == "employee"
apply firstApplicable
/**
* Employees can create documents in their own company
*/
rule createDocument{
target clause action.actionId=="create"
condition user.company==resource.company
permit
}
/**
* Employees can delete documents they own
*/
rule allowDelete{
target clause action.actionId == "delete"
condition user.userId == resource.owner
permit
}
}
}
Затем вам нужно развернуть политику в своем механизме авторизации / точке принятия решения о политике, и вы вызываете ее из перехватчика в вашем приложении. Делая это таким образом, вы отделяете бизнес-логику (приложение) от логики авторизации (политики). Это также означает, что вы можете повторно использовать одни и те же политики / авторизацию в своих приложениях независимо от языка и стека (API, приложение, БД ...)