У меня есть функция, которая проверяет права пользователя на некоторые ресурсы и действия. Эта функция имеет параметры user
, resource
и action
.
. Для этого я извлекаю строки из БД, где совпадают идентификаторы, и проверяю, находятся ли параметры внутри возвращенного запроса БД, если у пользователя есть разрешения.
Но есть некоторые особые случаи, например, если у пользователя есть ресурс как someresource/*
или *
, у него есть разрешения в этом ресурсе, если у пользователя есть действие как someaction/*
или *
у него есть разрешения на выполнение всех действий в указанном c ресурсе, поэтому *
означает все разрешения, но в некоторых случаях моя функция завершается ошибкой, что я не могу понять.
Моя функция:
def check_if_user_has_permissions(user = None , resource = None, action= None ):
tmp = {}
tmp["user"] = user
tmp["resource"] = resource
tmp["action"] = action
data = []
has_permission = db.session.query(RoleMember.user_uid, Permission.resource, Permission.action). \
filter_by(user_uid=user). \
join(Permission, Permission.role == RoleMember.role).all()
print(has_permission)
if resource and action is not None:
if has_permission == "":
return False
else:
for info in has_permission:
for item in info:
data.append(item)
if tmp["user"] in data and tmp["resource"] in data and tmp["action"] in data:
return True
if tmp["user"] in data and "*" in data[1] and "*" in data[2]:
return True
if tmp["user"] in data and "*" in data[1] and tmp["action"] in data:
return True
if tmp["user"] in data and tmp["resource"] in data and "*" in data[2]:
return True
else:
return False
else:
return False
Некоторые случаи, которые я тестировал:
["bender", "machine_1", "action1", True],
["bender", "machine_2", "action1", True],
["bender", "machine_3", "action1", True],
["bender", "machine_3", "action2", True],
["bender", "machine_1", "action3", False],
["bender", "machine_4", "action1", False],
["leela", "machine_2", "action1", False],
["leela", "file/2", "action4", True],
["leela", "file/2", "action2", False],
["leela", "application/1", "action1", True],
["leela", "application/2", "action1", False],
["fry", "application/1", "action1", True],
["zoidberg", "application/1", "action1", False],
]
С этой записью в БД:
[
("bender", "machine_1", "action1"),
("bender", "machine_2", "action1"),
("bender", "machine_3", "action1"),
("bender", "machine_3", "action2"),
("leela", "file/*", "action4"),
("leela", "application/1", "*"),
("fry", "*", "*")]
Сбой на ["leela", "file/2", "action4", True]
и ["leela", "machine_2", "action1", False]
Это означает, что в этом случае функция возвращает False для 1 и True для второго случая.