将 Django "rules" 与 CBV 一起使用似乎不起作用

Using Django "rules" with CBVs doesn't seem to work

每家餐厅可以有多位经理。

class Restaurant(models.Model):
    ...
    managers = models.ManyToManyField(User, related_name='restaurants_which_they_manage')

只有餐厅经理可以更改餐厅列表。我正在使用 django-rules 来强制执行此操作。我有一个谓词可以创建一个很好的冗长 "is_restaurant_manager" 参考:

@rules.predicate
def is_restaurant_manager(user, restaurant):
    return user in restaurant.managers.all()

这是权限:

rules.add_perm('restaurants.change_restaurant', is_restaurant_manager)

最后,这是我的看法:

class RestaurantChange(PermissionRequiredMixin, UpdateView):
    model = Restaurant
    permission_required = 'restaurants.change_restaurant'
    fields = ['name', 'description', ]

我有两个测试。

测试 A 检查权限是否正常工作:

self.assertEqual(rules.has_perm('restaurants.change_restaurant', self.user, self.restaurant), True)

第一次测试成功通过。

测试 B 尝试使用有效用户访问 url:

url = reverse('restaurants__restaurant_change', kwargs={'pk': self.restaurant.key,})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

测试 B 失败,因为我得到了重定向。如果我尝试通过浏览器访问 url,也会发生这种情况。重定向转到登录过程,就好像用户没有访问视图的权限一样。

我的代码有什么问题?

我正在研究 django-rules 看它是否适合项目的需要,运行 进入你在 django-rules 上添加的问题。

在测试中添加 pdb 跟踪并检查您的设置后,我注意到以下内容:

https://github.com/tavolia/Tavolia/blob/7aca6530a8a301b8b81999095cf7535c363dd484/_project/settings.py#L121-L124

https://github.com/tavolia/Tavolia/blob/7aca6530a8a301b8b81999095cf7535c363dd484/_project/settings.py#L142-L145

第二个 link 是一个作业,覆盖了之前作业中设置的身份验证后端。

通过将 'rules.permissions.ObjectPermissionBackend' 添加到第二组后端,测试顺利通过。

我在 github 上提出了一个拉取请求来解决这个问题:https://github.com/tavolia/Tavolia/pull/5

干杯!