我正在尝试让角色与Flask-Security一起工作,但即使current_user拥有我期望的角色,g.identity也没有为他们提供<Identity id="..." auth_type="None" provides=set([])>,并且@roles_accepted拒绝访问。
core.py中的函数_on_identity_loaded从未被调用过,我猜这就是谜团的一部分。我通过app.Flask.test_client()在单元测试中运行服务器。
我首先在Flask-Security网站上基于基于MongoEngine的教程做了一个小实验,当我使用它时,它起作用了。我还没有做过测试驱动的工作,所以我不知道test_client()是否也会失败。
由于我们使用的是MongoKit而不是MongoEngine,并且使用Flask作为REST服务,所以我不得不用比我希望的更多的代码来补充Flask-Security。
这部分工作正常,所以我认为我的User类正确地提供了角色:
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上使用比较实现了__eq__和__ne__,所以我不依赖于上面的断言的对象标识。
我使用不同的身份登录和注销,装饰器@login_required按预期工作。如果我把assert 0放在core._on_identity_loaded中,所有的运行都是一样的,所以这个函数永远不会被调用。我假设这就是应该用UserNeed填充身份的函数。角色?)所以它不起作用是有道理的。但是为什么不叫它呢?
我在OS 10.10.2上运行Python 2.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发布于 2020-12-14 19:44:09
我也有同样的问题。即使为用户正确解析了这些角色,也没有调用函数flask_security.core._on_identity_loaded,因此身份没有适当的权限。
原因是Security是使用flask.current_app而不是简单的app对象进行初始化的。这破坏了flask_security模块内部的信号机制。
解决方案是使用简单的app对象初始化Security
Security(app, datastore)或者从current_app获取该对象
Security(current_app._get_current_object(), datastore)https://stackoverflow.com/questions/29309974
复制相似问题