flask-restless 限制 RESTful api 访问

Posted

技术标签:

【中文标题】flask-restless 限制 RESTful api 访问【英文标题】:flask-restless restrict RESTfull api access 【发布时间】:2016-01-16 12:22:54 【问题描述】:

我只希望登录用户访问我的 RESTfull API。我一直在搜索,找不到任何告诉我如何做的来源。很奇怪,因为我认为保护数据很常见。

我正在使用带有Flask-loginflask-RestlessFlask 项目。我通过SQL-alchemy 类对我的数据进行CRUD 以访问我的mysql 数据库。我创建了我的 RESTfull api,例如:

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

我应该如何限制未登录的用户对我的 RESTfull api 的访问,或者我不能使用 flask-restless 进行访问?如果没有,我应该/可以更好地使用什么?

我正在尝试一些技术,欢迎任何方向的建议!

提前致谢


在玩了一些之后,我找到了解决方案。它可能不是最好的,但不需要太多代码就可以解决问题:

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

这是正确的方法吗?为每个可能的 HTTP 请求添加 Preprosessors 需要大量代码。 https://flask-restless.readthedocs.org/en/latest/customizing.html#request-preprocessors-and-postprocessors

【问题讨论】:

我正在尝试做同样的事情,如果你想出了更好的解决方案,我希望你能分享:) 有一个 hacky 方法可以做到这一点:***.com/questions/42533259/… 也不错.. 我删除了我的评论,因为我看到它与我在问题更新中提到的基本相同的解决方案。 【参考方案1】:

看来你通过customizing Flask-Restless 实现了你想要的。您可以使用预处理器来拦截您的 API 请求。

这是一个sn-p。请注意,这是一个未经测试的 sn-p。

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'])

【讨论】:

这行得通。我只是认为这可以做得更好。为什么?现在我必须将所有 HTTP 方法添加到 preprosessors 并说应该执行 auth_func()。 'POST', 'GET_SINGLE', 'GET_MANY', 'PATCH_SINGLE' or 'PUT_SINGLE', 'PATCH_MANY' or 'PUT_MANY', 'DELETE_SINGLE' 'DELETE_MANY' 这是很多代码。 那你为什么不把预处理器注册到你的APIManager呢?当我第一次写我的答案时,我以为您希望对 API 访问进行细粒度控制。我用这个建议更新了我的答案。 已经好多了。我仍然必须为每个 HTTP 方法添加用户身份验证(请参阅前面的评论)。我仍然觉得有人必须为此使用太多代码,我仍在寻找更好的解决方案。

以上是关于flask-restless 限制 RESTful api 访问的主要内容,如果未能解决你的问题,请参考以下文章

在 Flask-Restless 中遇到数据库连接问题

无法导入 Flask-Restless

Flask-Restless:manager.create_api() 不返回蓝图对象

Flask-Restless 无法构造查询

使用 flask-restless 对 POST 的错误请求与关系

Flask-Restless 过滤器不过滤结果