У меня есть модель управления доступом, которая состоит из двух уровней: Уровни доступа и Общие разрешения .
Пользовательский Уровень доступа управляет как максимальным набором разрешений, которые вы можете иметь в системе, так и предоставляет вам базовые c разрешения для создания объектов верхнего уровня в системе ( портфолио ios, программы, проекты и др. c ..). Объекты в системе также могут быть переданы вам кем-то еще в системе (таким образом, предоставляя вам одно или несколько разрешений конкретно для объекта). Если объект не был создан вами или не был назначен вам, вы сможете увидеть его, если он явно не предоставлен вам. Пример набора данных будет выглядеть примерно так:
"access_levels": {
"Worker": ["projects.view"],
"Planner": ["projects.create", "projects.edit", "projects.view"]
},
"users_access_level": {
"bob.jones@example.com": "Planner",
"joe.humphreys@example.com": "Worker"
},
"resource_hierarchy": {
"customer1": ["customer1"],
"project1": ["project1", "customer1"],
"project2": ["project2", "customer1"]
},
"resource_policyIDs": {
"customer1": "1",
"project1": "2",
"project2": "3",
},
"policies": {
"1": {
"permissions": ["projects.create"],
"subjects": ["users:joe.humphreys@example.com"]
},
"2": {
"permissions": ["projects.view"],
"subjects": ["users:joe.humphreys@example.com"]
},
"3": {}
}
, а политика будет выглядеть примерно так:
package authz
default authorized = false
authorized {
input.method == "POST"
http_path = ["programs", "create"]
input.customerId == token.payload.customerId
permitted_actions(token.payload.sub, input.customerId)[_] == "programs.create"
}
subjects_resource_permissions(sub, resource) = { perm |
resource_ancestors := data.resource_hierarchy[resource]
ancestor := resource_ancestors[_]
id := data.resource_policyIDs[ancestor]
data.policies[id]["subjects"][_] == sprintf("users:%v", [sub])
perm := data.policies[id]["permissions"][_]
}
permitted_actions(sub, resource) = x {
resource_permissions := subjects_resource_permissions(sub, resource)
access_permissions := data.access_levels[data.users_access_level[sub]]
perms := {p | p := access_permissions}
x = perms & resource_permissions
}
http_path := split(trim_left(input.path, "/"), "/")
Допустим, я создал API Projects для управления проектом Ресурсы. В API есть метод для перечисления проектов, и метод должен возвращать только те проекты, к которым у пользователя есть доступ к представлению. Таким образом, в приведенном выше примере пользователь «joe. humphreys@example.com» не должен иметь возможность просматривать Project 2, даже если его уровень доступа дает ему «projects.view». Это связано с тем, что им с ним не поделились.
Если бы я хотел использовать OPA, как я мог бы предоставить общий шаблон для выполнения sh в нескольких API? Как бы выглядел запрос к OPA для выполнения sh что-то вроде этого? Другими словами, если бы я хотел применить эту авторизацию в SQL, как бы это выглядело?
Я прочитал эту статью , но мне трудно понять, как это подходит здесь ..