Django-tastypie: prepend_urls обходит аутентификацию

Созданный на 25 авг. 2012  ·  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

Самый полезный комментарий

Я еще не пробовал это сделать, но если это сработает, как вы говорите, я определенно буду подходить к нему. Тем не менее, я все еще думаю, что то, что я здесь сообщил, является проблемой с Tastypie - в основном, если вы используете метод, показанный в кулинарной книге, аутентификацию можно полностью обойти, даже если разработчик даже не осознает.

Все 8 Комментарий

По моему опыту, гораздо проще и элегантнее использовать только функцию override_urls и создать собственный дочерний метод отправки. Это меньше кода, соблюдает все мета-свойства вашего дочернего ресурса (включая аутентификацию), а также некоторые другие.

Пример:

    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 /, как если бы он был запрошен как представление списка (измените «список» на «деталь», чтобы он вел себя как подробное представление).

Я еще не пробовал это сделать, но если это сработает, как вы говорите, я определенно буду подходить к нему. Тем не менее, я все еще думаю, что то, что я здесь сообщил, является проблемой с Tastypie - в основном, если вы используете метод, показанный в кулинарной книге, аутентификацию можно полностью обойти, даже если разработчик даже не осознает.

У меня такая же проблема, и я попробовал метод joeribekker с теми же результатами, есть идеи, когда это будет исправлено? или какие-то обходные пути?

Мне нравится идея использовать Resource.dispatch() , но если вы хотите сделать что-то более сложное, чем просмотр деталей или список, то это не совсем жизнеспособно.

Одно из решений, о котором я думал, - это переместить часть более тяжелого подъема из Resource.dispatch() в Resource.wrap_view() чтобы можно было использовать wrap_view() для произвольного обертывания любого представления, применяя все правила аутентификации, авторизации и регулирования (возможно, проверка метода тоже, хотя об этом ниже).

Я столкнулся с этой проблемой с дросселированием. Мой текущий обходной путь - иметь декоратор, в который я помещаю свои пользовательские представления: @apply_throttle . Декоратор более или менее копирует код из Resource.throttle_check() и Resource.log_throttled_access() .

Для вкусного пирога может быть наиболее эффективным иметь как более полные wrap_view() (включая вышеперечисленные) _и_ декораторы (или какой-либо другой способ выборочного применения этих вещей) на тот случай, если разработчик намерен использовать переопределения для фактически обойти нормальное поведение (например, если у вас есть переопределенная конечная точка, которая требует другого регулирования или ослабляет требования аутентификации). Декораторы также были бы хорошим способом применить определенные проверки метода (GET, POST и т. Д.) Для переопределений, без необходимости иметь этот шаблон в начале вашего метода. Я знаю, что использовал переопределения там, где все это было бы полезно.

Что все думают о таком решении? Мне определенно интересно поработать над этим, но сейчас у меня мало времени.

Я боролся с этим, но я нашел и ответил на SO.
http://stackoverflow.com/questions/11827368/tastypie-override-urls-ignores-authentication-and-authorization

Это старый поток, но поскольку проблемы все еще открыты и занимают высокое место в моем поиске ... обращение к
self.is_authenticated(request) в первой строке обработчика позаботится об этой проблеме. тестировалось с вкусным пирогом 0.11 и 0.12.

Книга рецептов теперь рекомендует использовать self.wrap_view () внутри prepend_urls (), закрывая эту проблему.

Событие с wrap_view, мне нужно self.is_authenticated(request) в методе обработчика.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги