首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flask-安全@roles_accepted不工作。为什么g.identity不提供授予用户的角色?

Flask-安全@roles_accepted不工作。为什么g.identity不提供授予用户的角色?
EN

Stack Overflow用户
提问于 2015-03-28 04:49:59
回答 1查看 482关注 0票数 0

我正在尝试让角色与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类正确地提供了角色:

代码语言:javascript
运行
复制
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,如下所示。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-12-14 19:44:09

我也有同样的问题。即使为用户正确解析了这些角色,也没有调用函数flask_security.core._on_identity_loaded,因此身份没有适当的权限。

原因是Security是使用flask.current_app而不是简单的app对象进行初始化的。这破坏了flask_security模块内部的信号机制。

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

代码语言:javascript
运行
复制
Security(app, datastore)

或者从current_app获取该对象

代码语言:javascript
运行
复制
Security(current_app._get_current_object(), datastore)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29309974

复制
相关文章

相似问题

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