我正在构建基于Flask的REST API并使用Flask-JWT来处理JWT身份验证.我还想使用Flask-Security的内置角色管理.但是,Flask-Security的@roles_required()装饰器假设我在失败时显示Flask视图.
这是我的令牌端点(它正在按我的意愿工作):
$ 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"
}
Run Code Online (Sandbox Code Playgroud)
以下是对没有任何角色要求的资源的成功响应(仅使用@jwt_required)这也是我想要的:
$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]>
Run Code Online (Sandbox Code Playgroud)
当我对具有所需角色的资源(例如本例中的admin)执行相同操作时,似乎假设我有一个要显示的页面,例如/ login,我没有,因为它是无头REST API:
$ 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: …Run Code Online (Sandbox Code Playgroud) 任何人都可以判断这3个扩展之间是否存在根本区别,或者它们是否都做类似的事情?我一直在阅读文档,似乎有很多交叉.我猜一些只是提供更多的功能.
我想在我的应用中添加用户角色,以便某些用户具有某些权限.即level1用户可以创建5个资源,level2用户可以创建10个等等.我一直在寻找滚动我自己,它似乎并不太棘手.我正在考虑使用这个http://flask.pocoo.org/snippets/98/的装饰器,这个解决方案会有任何安全问题吗?我已经在使用Flask-login了,所以我将它与它集成.
我正在使用Flask Login和Principal进行身份和角色管理.我的需求直接来自文档.我的代码在这里:
@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):
# Set the identity user object
identity.user = current_user
# Add the UserNeed to the identity
if hasattr(current_user, 'get_id'):
print 'current_user ' + str(current_user.get_id())
identity.provides.add(UserNeed(current_user.get_id))
# Assuming the User model has a list of roles, update the
# identity with the roles that the user provides
if hasattr(current_user, 'roles'):
if current_user.roles:
for role in current_user.roles:
identity.provides.add(RoleNeed(role.name))
Run Code Online (Sandbox Code Playgroud)
在我的登录代码中,我这样做:
identity_changed.send(current_app._get_current_object(),
identity=Identity(user.user_id)
Run Code Online (Sandbox Code Playgroud)
登录时,信号按预期触发.在每个后续页面加载时,current_user是匿名的,并且没有用户ID,但所有@login_required函数的行为就像用户登录一样.Flask登录知道用户已登录,但由于某种原因,current_user不一致.
我错过了某处的基本配置点吗?
我一直在看这篇文章:http: //pythonhosted.org/Flask-Principal/#granular-resource-protection
现在虽然它目前的工作方式没有任何问题,但我看不出它是非常实用的,因为在登录时所有帖子都被读取并且EditBlogPostNeed被添加到身份中.
想象一下,如果我写的不仅仅是正常数量的帖子,那么从长远来看这不是一个非常好的策略,因为我想在访问视图时查看帖子/posts/<post_id>.
有没有办法检查每个使用视图的请求Flask Principal?
我当然可以通过懒惰的关系查询和过滤器轻松解决它,但我想使用Flask Principal.
我是写作瓶子的新手,目前flask-principal用作我的授权机制.当用户尝试访问没有所需权限的URL时,flask-principal会引发PermissionDenied异常.
它导致我的系统抛出500 internal server错误.
我怎样才能捕获特定的异常并将用户重定向到警告页面呢?如果您可以共享代码示例,那将非常有用.
全部,我正在编写一个烧瓶应用程序,它依赖于flask-principal来管理用户角色.我想编写一些简单的单元测试来检查哪些用户可以访问哪些视图.在pastebin上发布了一个代码示例,以避免混乱这篇文章.简而言之,我定义了一些路由,修改了一些路径,以便只有具有适当角色的用户才能访问它们,然后尝试在测试中访问它们.
在粘贴的代码中,test_member并且test_admin_b两者都失败了,抱怨一个PermissionDenied.显然,我没有正确宣布用户; 至少,有关用户角色的信息不在正确的上下文中.
任何有关上下文处理复杂性的帮助或见解都将深受赞赏.
我使用Flask-Login和Flask-Principal处理Flask应用程序,除了记住Flask-Login的功能外,一切正常.
实际上,remember me函数在Flask-Login端工作,但Flask-Principal的idenity_loaded函数不会被触发.
当我记录@ login_manager.user_loader和@ identity_loaded.connect的调用时,看到我登录时都被调用,但是当我关闭浏览器并再次启动它时,只会调用@ login_manager.user_loader.所以我的用户基本上登录但没有角色.
Flask-Login 在GitHub上有一个已关闭的问题#19,但它实际上没有回答我的问题: - /
有人知道如何在用户从cookie加载时做出反应吗?
我正在尝试创建一个权限,要求用户具有角色A或角色B.
根据Python Flask Principal文档,以下行创建了一个权限,要求用户具有roleA和roleB.
combined_permission = Permission(RoleNeed('roleA'), RoleNeed('roleB'))
Run Code Online (Sandbox Code Playgroud)
你知道怎么创建一个依赖OR而不是AND的权限吗?
我正在为我的 Flask 应用程序编辑用户页面,但我似乎无法弄清楚如何像处理其他变量(例如电子邮件)一样呈现用户的当前角色。
这是我的模型、形式和视图:
#Flask-Principal Role Model
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
def __repr__(self):
return '<Role %r>' % (self.name)
#SQLALchemy User Model
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
first_name = db.Column(db.String(128))
last_name = db.Column(db.String(128))
business_name = db.Column(db.String(128))
active = db.Column(db.Boolean())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
#WTForms User Form
class UserForm(Form):
first_name = StringField('first name', validators= [Required()])
last_name = StringField('last name', …Run Code Online (Sandbox Code Playgroud) flask ×8
python ×7
flask-login ×2
acl ×1
flask-jwt ×1
identity ×1
jinja2 ×1
permissions ×1
rest ×1
unit-testing ×1
wtforms ×1