Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask Security@roles\u不工作。为什么不是';t g.提供授予用户的角色的身份?_Python_Mongodb_Python 2.7_Flask_Authorization - Fatal编程技术网

Python Flask Security@roles\u不工作。为什么不是';t g.提供授予用户的角色的身份?

Python Flask Security@roles\u不工作。为什么不是';t g.提供授予用户的角色的身份?,python,mongodb,python-2.7,flask,authorization,Python,Mongodb,Python 2.7,Flask,Authorization,我正在尝试让角色与Flask Security一起工作,但即使当前用户拥有我期望的角色,g.identity不提供这些角色,并且@roles\u接受的拒绝访问 core.py中加载的_identity_上的函数从未被调用,我想这是一个谜。我正在通过app.Flask.test\u client()在单元测试中运行服务器 我首先在Flask Security站点上根据基于MongoEngine的教程做了一个小实验,当我使用它时,它就起作用了。我还没有使用过测试驱动,所以我不知道如果使用test\u

我正在尝试让角色与Flask Security一起工作,但即使当前用户拥有我期望的角色,
g.identity
不提供这些角色,并且
@roles\u接受的
拒绝访问

core.py中加载的_identity_上的函数
从未被调用,我想这是一个谜。我正在通过
app.Flask.test\u client()
在单元测试中运行服务器

我首先在Flask Security站点上根据基于MongoEngine的教程做了一个小实验,当我使用它时,它就起作用了。我还没有使用过测试驱动,所以我不知道如果使用
test\u client()
,它是否也会失败

因为我们使用MongoKit而不是MongoEngine,并且使用Flask提供REST服务,所以我不得不用比我希望的更多的代码来补充Flask安全性

这部分工作正常,因此我认为我的用户类正确地提供了角色:

u = api_security.user_datastore.find_user(email=u'admin')
r = api_security.user_datastore.find_role(u'admin')
api_security.user_datastore.add_role_to_user(u, r)
assert r in u.roles
我已经使用mongo id上的比较实现了
\uuuuu eq\uuuu
\uu ne\uuuuu
,因此我不依赖上面断言的对象标识

我使用不同的身份登录和注销,并且decorator
@login\u required
按预期工作。如果我将
assert 0
放在
core.\u on\u identity\u loaded
中,它的运行方式都是一样的,因此该函数永远不会被调用。我假设这是一个应该用UserNeed(又称角色?)填充身份的函数,所以它不起作用是有道理的。。。但是为什么不叫它呢

我在OSX10.10.2上的Python2.7.6中运行如下

Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-Principal==0.4.0
Flask-RESTful==0.3.2
Flask-Security==1.7.4
Flask-WTF==0.11
mongokit==0.9.1.1
pymongo==2.8
Werkzeug==0.10.1
WTForms==2.0.2

我也有同样的问题。即使为用户正确解析了角色,也没有调用加载的函数
flask\u security.core.\u on\u identity\u
,因此identity没有适当的权限

原因是
Security
是使用
flask.current\u app
而不是简单的
app
对象初始化的。这会破坏
flask\u安全
模块内的信号机制

解决方案是使用简单的
app
对象初始化
安全性

Security(app, datastore)
或者从
当前应用程序获取该对象

Security(current_app._get_current_object(), datastore)

我制作了一个小型REST客户端,这样我就可以不用依赖test_client()来测试服务器。同样的结果@即使用户拥有所需的角色,roles\u accepted仍然拒绝访问。我重新访问了我的初始实验,并且@roles\u accepted仍然按照预期工作。因此,我的用于Flask安全性的MongoKit适配器似乎不是罪魁祸首。实验和我后来(失败)的尝试之间的主要区别在于,问题代码使用蓝图,并提供REST API而不是HTML模板。我正在探索在使用MongoKit而不是MongoEngine的项目中使用Flask安全性。根据你的经验,这是否可行?谢谢