Функция разрешения не работает в двух случаях - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть функция, которая проверяет права пользователя на некоторые ресурсы и действия. Эта функция имеет параметры 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 для второго случая.

1 Ответ

0 голосов
/ 27 февраля 2020

Я мог найти проблему через несколько часов, пробуя разные вещи. В итоге был else, который был пропущен, и я не знал, что смогу сделать for else l oop в python.

Решение:

def check_if_user_has_permissions(user=None, resource=None, action=None):

if resource and action is not None:
    tmp = {"user": user, "resource": resource, "action": action}
    has_permission = db.session.query(RoleMember.user_uid, Permission.resource, Permission.action). \
        filter_by(user_uid=user).join(Permission, Permission.role == RoleMember.role).all()
    if not has_permission:
        return False
    else:
        for permission in has_permission:
            if tmp["user"] in permission[0] and tmp["resource"] in permission[1] and tmp["action"] in permission[2]:
                return True

            if tmp["user"] in permission and ('*' in permission[1]) and tmp["action"] in permission:
                return True

            if tmp["user"] in permission[0] and tmp["resource"] in permission[1] and ('*' in permission[2]):
                return True

            if tmp["user"] in permission[0] and ('*' in permission[1]) and ('*' in permission[2]):
                return True
        else:
            return False
else:
    return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...