2015-11-25 50 views
1

我正在关注Flask-potion教程并尝试保护我的api。我试图弄清楚如何在用户端点上设置权限,以便用户无法查看其他用户的记录。这里是我的代码:Flask-Potion + Flask-Principal锁定用户资源

class UserResource(PrincipalResource): 
    class Meta: 
     model = User 
     permissions = { 
      'read': 'id' 
     } 

class ArticleResource(PrincipalResource): 
    class Schema: 
     author = fields.ToOne('user') 

class Meta: 
    model = Article 
    read_only_fields = ['author'] 
    permissions = { 
     'create': 'editor', 
     'update': ['user:author', 'admin'] 
    } 

我需要一个自定义权限来做到这一点?看起来这将是一种常见的情况。

回答

2

Flask-Principals中的所有“需求”都是元组。您写入UserResource的权限配置{'read': 'id'}角色需求匹配('role', 'id')。你想匹配类似('id', user_id)。不幸的是,目前尚不支持。

然而,你可以匹配的是一个ItemNeed,例如, ('read', user_id, 'user')。为了匹配ItemNeed,设置您的权限配置{'read': 'read'},然后加载你的身份时,只需添加项目的权限是这样的:

identity.provides.add(ItemNeed('read', current_user.id, 'user')) 
+0

我有点困惑与本 - 是否有一个原因ItemNeed第一酒店在这种情况下被命名为“读”?这就是绊倒我的原因。另外由于某种原因,当我实现这样的东西,并去我没有访问的资源,我得到一个404?那是对的吗? – DaBeeeenster

+0

@DaBeeeenster Flask-Principals item-needs是'(method,value,model)'的三倍。您引用的ItemNeed允许读取用户模型。有一个待定的PR用于简化这个:从下一个版本开始,或者'user:$ id''将解析为UserNeed。 – lyschoening

+0

@DaBeeeenster 404是正确的回应。如果你返回400,它将允许人们监视他们无法访问的资源ID。 – lyschoening