Django-tastypie: prepend_urls绕过身份验证

创建于 2012-08-25  ·  8评论  ·  资料来源: django-tastypie/django-tastypie

抱歉,如果我在这里做的是设计使然,或者我做的事情完全错误,但是我认为使用prepend_urls创建嵌套资源会绕过父级和子级资源的身份验证。 我创建了一个与Cookbook类似的示例,并使用ApiKey身份验证创建了一个子资源,即使没有传递正确的标头,我也可以访问它。 父资源还需要ApiKey身份验证。

我没有身份验证标头看到的是:

GET / api / v1 / article-预期为401
GET / api / v1 / article / 1 /-预期的401
GET / api / v1 / article / 1 / tags-标签列表意外返回。

在我看来,这是不正确的,而且肯定不是我期望看到的。

bug documentation unconfirmed

最有用的评论

我还没有尝试过,但是如果按照您所说的那样起作用,那绝对是我采取的一种方法。 但是,我仍然认为我在这里所报告的是Deliciouspie的问题-基本上,如果您使用菜谱中说明的技术,即使开发人员甚至没有意识到,也可以完全绕过身份验证。

所有8条评论

以我的经验,仅使用override_urls函数并创建自己的dispatch child方法会容易得多,也更优雅。 它的代码更少,遵循所有子资源元属性(包括身份验证),然后遵循某些属性。

例子:

    def override_urls(self):
        return [
            url(r'^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/tags%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_tags'), name='api_article_tags'),
        ]

    def dispatch_tags(self, request, **kwargs):
        return ArticleTagResource().dispatch('list', request, **kwargs)

基本上,这使您的ArticleTagResource可以处理/ article / 1 / tags /中的整个请求,就像将其作为列表视图一样(将“ list”更改为“ detail”以使其表现得像detail-view)。

我还没有尝试过,但是如果按照您所说的那样起作用,那绝对是我采取的一种方法。 但是,我仍然认为我在这里所报告的是Deliciouspie的问题-基本上,如果您使用菜谱中说明的技术,即使开发人员甚至没有意识到,也可以完全绕过身份验证。

我遇到了同样的问题,并且我尝试了joeribekker的方法同样的结果,什么时候可以解决? 或任何解决方法?

我喜欢使用Resource.dispatch()的想法,但是如果您想做的事情比细节视图或列表视图更复杂,那么它实际上是不可行的。

一个解决方案,我一直在想的是将一些从较重的提升Resource.dispatch()Resource.wrap_view()使wrap_view()可用于任意包装任何观点,而将所有的身份验证,授权和限制规则(可能还会检查方法,尽管下面会对此进行详细介绍)。

我遇到了节流的问题。 我当前的解决方法是有一个装饰器,将我的自定义视图包装在@apply_throttle 。 装饰器或多或少地从Resource.throttle_check()Resource.log_throttled_access()复制代码。

对于美食家来说,同时拥有一个更完整的wrap_view() (包括上述内容)装饰器(或其他一些有选择地应用这些内容的方式)可能是最有效的,以防万一开发人员使用覆盖的意图实际上绕过了正常行为(例如,如果您有一个需要不同限制或放宽身份验证要求的覆盖端点)。 装饰器也是将特定方法检查(GET,POST等)应用于覆盖的一种好方法,而不必在方法开始时使用该样板。 我知道我在所有这些都有用的地方使用了替代。

每个人对这种解决方案有何想法? 我当然对此很感兴趣,但是现在我的时间非常紧张。

这是一个旧话题,但是由于问题仍然悬而未决,在我的搜索中排名很高...
处理程序第一行中的self.is_authenticated(request)将解决此问题。 用好吃的0.11和0.12进行了测试。

现在,菜谱建议在prepend_urls()内使用self.wrap_view(),以解决此问题。

与wrap_view一起使用的事件,我需要在处理程序方法中使用self.is_authenticated(request)

此页面是否有帮助?
0 / 5 - 0 等级