flask-restless ограничить доступ RESTfull API

Я хочу, чтобы только зарегистрированные пользователи имели доступ к моему RESTfull API. Я искал повсюду и не мог найти ни одного источника, который сказал бы мне, как это сделать. Странно, потому что я думаю, что защита данных очень распространена.

Я использую проект Flask с Flask-login и flask-Restless. Я CRUD свои данные через SQL-alchemy классов для доступа к моей базе данных MySQL. Я создаю свой RESTfull API, например:

api_manager = APIManager(app, flask_sqlalchemy_db=db)
api_manager.create_api(Items, methods=['GET', 'POST', 'DELETE', 'PUT'])

Как мне ограничить доступ к моему API RESTfull для пользователей, которые не вошли в систему, или я не могу сделать это с flask-restless? Если нет, то что лучше/могу ли я использовать?

Я пробую некоторые методы, поэтому предложения в любых направлениях приветствуются!

заранее спасибо


После еще нескольких игр я нашел решение. Возможно, это не лучший вариант, но он делает свое дело без лишнего кода:

@app.before_request
def before_request():
    if ('/api/' in str(request.url_rule)) && (not current_user.is_authenticated()):
        return redirect('/login')

Это правильный путь? Добавление препроцессоров — это много кода для каждого возможного HTTP-запроса. https://flask-restless.readthedocs.org/en/latest/customizing.html#request-preprocessors-and-postprocessors


person Waxyen Flax    schedule 17.10.2015    source источник
comment
Я пытаюсь сделать то же самое, если вы придумали лучшее решение, надеюсь, вы поделитесь им :)   -  person Motassem MK    schedule 01.03.2017
comment
есть хакерский способ сделать это: колба httpauth">stackoverflow.com/questions/42533259/   -  person Motassem MK    schedule 02.03.2017
comment
тоже хороший способ..   -  person Motassem MK    schedule 02.03.2017
comment
Я удалил свой комментарий, потому что увидел, что это в основном то же решение, о котором я упоминал в обновлении вопроса.   -  person Waxyen Flax    schedule 02.03.2017


Ответы (1)


Кажется, вы достигли желаемого, настроив Flask-Restless. Вы можете использовать препроцессор для перехвата вашего запроса API.

Вот фрагмент. Пожалуйста, имейте в виду, что это непроверенный фрагмент.

def auth_func(*args, **kw):
    if not current_user.is_authenticated():
        raise ProcessingException(description='Not authenticated!', code=401)

api_manager = APIManager(app, flask_sqlalchemy_db=db)
api_manager.create_api(Items, methods=['GET', 'POST', 'DELETE', 'PUT'], preprocessors=dict(POST=[auth_func]))

Точно так же вы можете зарегистрировать препроцессор в своем APIManager, включив его для всех API.

api_manager = APIManager(app, flask_sqlalchemy_db=db, preprocessors=dict(POST=[auth_func]))
api_manager.create_api(Items, methods=['GET', 'POST', 'DELETE', 'PUT'])
person Trein    schedule 18.10.2015
comment
Это сработает. Я просто думаю, что это можно было бы сделать лучше. Почему? Теперь мне нужно добавить все HTTP-методы в препроцессоры и сказать, что auth_func() должен выполняться. «POST», «GET_SINGLE», «GET_MANY», «PATCH_SINGLE» или «PUT_SINGLE», «PATCH_MANY» или «PUT_MANY», «DELETE_SINGLE», «DELETE_MANY» Это очень много кода. - person Waxyen Flax; 18.10.2015
comment
Так почему бы вам тогда не зарегистрировать препроцессор на свой APIManager? Когда я впервые написал свой ответ, я подумал, что вам нужен точный контроль над доступом к API. Я обновил свой ответ предложением. - person Trein; 19.10.2015
comment
Это уже намного лучше. Мне все еще нужно добавить аутентификацию пользователя для каждого метода HTTP (см. предыдущий комментарий). У меня все еще есть ощущение, что кто-то должен использовать для этого слишком много кода, и я все еще ищу лучшее решение. - person Waxyen Flax; 19.10.2015