首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Flask安全角色与Flask-JWT REST API结合使用

将Flask安全角色与Flask-JWT REST API结合使用
EN

Stack Overflow用户
提问于 2015-11-09 01:58:37
回答 1查看 4K关注 0票数 28

我正在构建一个基于Flask的REST API,并使用Flask-JWT来处理JWT身份验证。我还想通过Flask-Security使用内置的角色管理。但是,Flask -Security的@roles_required()装饰器假设我在失败时显示了一个Flask视图。

下面是我的令牌端点(它的工作方式与我想要的一样):

代码语言:javascript
运行
复制
$ http POST localhost:5000/auth/token username='test' password='test'
HTTP/1.0 200 OK
Content-Length: 192
Content-Type: application/json
Date: Sun, 08 Nov 2015 17:45:46 GMT
Server: Werkzeug/0.10.4 Python/3.5.0

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ"
}

下面是对一个没有任何角色要求的资源的成功响应(只使用@jwt_required),这也是我想要的:

代码语言:javascript
运行
复制
$http GET localhost:5000/protected Authorization:'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ'
HTTP/1.0 200 OK
Content-Length: 25
Content-Type: text/html; charset=utf-8
Date: Sun, 08 Nov 2015 17:46:24 GMT
Server: Werkzeug/0.10.4 Python/3.5.0

<models.User[email=test]>

当我对需要角色的资源(例如本例中的管理员)执行相同的操作时,似乎假设我有一个页面要显示,例如/login,但我没有这样做,因为它是一个无头REST API:

代码语言:javascript
运行
复制
$ http GET localhost:5000/admin Authorization:'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ'
HTTP/1.0 302 FOUND
Content-Length: 209
Content-Type: text/html; charset=utf-8
Date: Sun, 08 Nov 2015 17:46:43 GMT
Location: http://localhost:5000/
Server: Werkzeug/0.10.4 Python/3.5.0
Set-Cookie: session=eyJfZmxhc2hlcyI6W3siIHQiOlsiZXJyb3IiLCJZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgcmVzb3VyY2UuIl19XX0.CSEcAw.pjwXLeSWUsORXR-OU5AfFvq6ESg; HttpOnly; Path=/

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/">/</a>.  If not click the link.

我知道Flask-Security在幕后使用Flask-Principal进行角色管理(@roles_required等)它与数据存储的RoleMixin和UserMixin绑定在一起,这是非常好的。然而,如果没有办法让Flask-Security在不使用JWT头的情况下只允许资源通过,那么最好的办法是构建我自己的装饰器,它使用Flask-Principal来管理角色。

有没有人有这方面的经验?我们的想法是,整个前端可以并将使用我们需要的任何语言构建,这意味着它可能不是Flask的模板/视图,而Flask-Security似乎正在做这件事。

感谢任何人能提供的任何见解!

EN

回答 1

Stack Overflow用户

发布于 2020-07-07 18:12:23

您可能希望使用HTTP状态代码403来响应,而不是重定向。

您最好的选择确实是创建自己的装饰器来管理角色,并且完全远离使用Flask-Security

Flask-Security has mentioned的作者说,有更好的方法来保护API,而且它甚至更有意义,因为库不需要维护。

Flask-JWTFlask-JWT-Extended是这项任务的最佳候选者。前者需要更多的样板文件才能让事情进行下去。有一个stale PR建议支持角色,如果你决定使用Flask-JWT,你可以用它来创建自己的装饰器。

Flask-JWT-Extended文档建议了一种更简单的解决方案,可能适合您的情况。对于完整的示例,您应该遵循文档的custom decorators部分,但这里是简单的装饰器:

代码语言:javascript
运行
复制
from functools import wraps

from flask import jsonify
from flask_jwt_extended import (
    verify_jwt_in_request, get_jwt_claims
)

def admin_required(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        verify_jwt_in_request()
        claims = get_jwt_claims()
        if claims['roles'] != 'admin':
            return jsonify(msg='Admins only!'), 403
        else:
            return fn(*args, **kwargs)
    return wrapper

此代码在JWT中查找roles声明,如果不是admin,则返回403响应。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33597150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档