Dancer Hooks на основе метода запроса?

Я работаю над приложением CRUD, используя Dancer. Одна из вещей, которые мне нужно сделать, это проверить, авторизован ли пользователь для выполнения операций POST (создание) и PUT (обновление) / DELETE (удаление).

Я прочитал о before хуки в документации Dancer, но не смогли найти лучший способ сделать разные типы авторизации.

Для операции POST все, что я хочу сделать, это проверить, что действительный ключ API был отправлен с запросом, но для операции PUT/DELETE я хочу убедиться, что представленный ключ API соответствует пользователю, который прикреплен к записи. быть обновленным или удаленным.

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

3 ответа

Как я и говорил на IRC, я думаю, что комбинация https://metacpan.org/pod/Dancer (объект запроса Dancer) и его HTTP-глаголов, запрашивающих вещи, должны помочь. См. Например: https://metacpan.org/pod/Dancer::Request.

Я не уверен, что это очень элегантное решение, но я думаю, что оно должно работать.

Вот еще один взгляд на эту проблему, основанный на опыте:

Поскольку у Dancer не было возможности анализировать ваши входные параметры при выполнении хука 'before', у вас может не быть согласованного способа считывания учетных данных для аутентификации, если ваше приложение позволяет предоставлять их различными способами.

В частности, если вы используете входные параметры для передачи одноразового номера для предотвращения CSRF-атак (что вы обязательно должны учитывать!), У вас не будет согласованного способа получения этого одноразового номера. Вы можете выполнить свой собственный анализ мини-параметров внутри 'before', но это может быть и грязным.

Я столкнулся с этой проблемой, когда работал над приложением некоторое время назад, и помню, что мне нужно было добавить страшную шаблонную аутентификацию для каждого маршрута PUT/POST/DELETE. Затем, если вы делаете это, становится неуместным проверять request->is_post, потому что вы уже решаете, следует ли размещать шаблонную функцию аутентификации в маршруте.

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

Действие может решить не обслуживать текущий запрос и попросить Dancer обработать запрос следующим подходящим маршрутом. Это делается с помощью ключевого слова pass, как в следующем примере

get '/say/:word' => sub {
return pass if (params->{word} =~ /^\d+$/);
"I say a word: ".params->{word};
};

get '/say/:number' => sub {
    "I say a number: ".params->{number};
};
Другие вопросы по тегам