Безопасность Flask @roles_accepted из имени пути

@app.route('/<string:charity_id>/glc')
# @roles_accepted('admin',charity_id[:3])
def GLC(charity_id):
    ...
    ...
    return render_template('one.html',charity_id=charity_id)

Есть ли способ разрешить роль, как определено первыми 3 символами charity_id, т.е. charity_id[:3]. В настоящее время, если строка комментария не закомментирована,charity_id не определен и поэтому не работает.

Я пытаюсь разрешить кому-то с ролью «admin» или «charity_id[:3]» войти на страницу. Каждому пользователю назначается роль в протоколе безопасности фляги. Я пытаюсь проверить, разрешены ли лица на странице на основе идентификатора страницы, т.е. строка:charity_id

Большое спасибо


person ob318    schedule 30.06.2020    source источник


Ответы (1)


Я не знаю, для чего это нужно, но как вы можете видеть, что декоратор @roles_accepted работает только с ролями и запускает конечную точку только тогда, когда perm.can().

Вы можете создать собственный decorator (просто пример):

def custom_roles(roles: list, path_param: str):
    def wrapper(fn):
        @roles_accepted(*roles)  # just roles like in docs
        @wraps(fn)
        def decorated_view(*args, **kwargs):
            # try to open /100-test/glc
            sub_charity_id = kwargs.get(path_param)[:3]  # 100
            # call route using roles_accepted decorator and path param
            fn2 = roles_accepted(*[sub_charity_id])(fn)
            return fn2(*args, **kwargs)
        return decorated_view
    return wrapper


@app.route('/<string:charity_id>/glc')
@custom_roles(roles=['admin'], path_param='charity_id')
def glc(charity_id):
    return 'test'

Или вызовите roles_accepted внутри маршрута:

def do_something(charity_id: str):
    return charity_id


@app.route('/<string:charity_id>/glc')
@roles_accepted('admin', 'editor')
def glc(charity_id):
    fn = roles_accepted(*[charity_id[:3]])(do_something)
    return fn(charity_id)

Надеюсь это поможет.

person Danila Ganchar    schedule 30.06.2020