2015-10-14 4 views
14

Я недавно начал изучать Clojure, и я хотел создать простое веб-приложение с базовыми функциями CRUD. Я нашел хороший учебник здесь: http://www.xuan-wu.com/2013-09-21-Basic-Web-Application-in-Clojure.Не удалось выполнить запрос POST в Clojure

Запросы GET работать нормально, но когда я пытаюсь пост запрос, я получаю следующее сообщение об ошибке:

Invalid anti-forgery token 

В учебнике я уже упоминал ранее, не решает ничего связанные с безопасностью. Я немного искал, и кажется, что мне не хватает какого-то компонента Compojure, который должен генерировать токен для создания запросов POST. В некоторых местах упоминалось, что я должен был произойти автоматически без каких-либо изменений с моей стороны. Я все еще не уверен, что это такое, чего я не хватает. Вот мой код:

(ns myblog.handler 
    (:require [compojure.core :refer :all] 
      [compojure.route :as route] 
      [ring.middleware.defaults :refer [wrap-defaults site-defaults]] 
      [myblog.views :as views] 
      [myblog.posts :as posts] 
      [ring.util.response :as resp] 
      [ring.middleware.basic-authentication :refer :all])) 

(defn authenticated? [name pass] 
    (and (= name "user") 
     (= pass "pass"))) 

(defroutes public-routes 
    (GET "/" [] (views/main-page)) 
    (route/resources "/")) 

(defroutes protected-routes 
    (GET "/admin" [] (views/admin-page)) 
    (GET "/admin/add" [] (views/add-post)) 
    (POST "/admin/create" [& params] 
     (do (posts/create params) 
      (resp/redirect "/admin")))) 

(defroutes app-routes 
    public-routes 
    (wrap-basic-authentication protected-routes authenticated?) 
    (route/not-found "Not Found")) 

(def app 
    (wrap-defaults app-routes site-defaults)) 

Опять же, только запрос POST «/ администратор/создает» не удается с недействительными маркерами ошибки. Любая идея, что я делаю неправильно?

+0

как вы делаете запрос POST? что-то вроде «завиток» или в браузере? – leeor

+0

В браузере.Я отправляю форму/admin/create. –

ответ

3

См. Этот github example. Особенно в нижней части:

ring-defaults includes anti-forgery by default for POST requests (and others that modify data).

Я думаю, вы должны изменить свое использование по умолчанию, если вы не хотите:

wrap-defaults routes site-defaults 

Если вы не хотите, чтобы отключить его, вам нужно либо отправить форму со скрытым полем с маркером, либо передать ее в заголовок через X-CSRF-Token и X-XSRF-Token. Для получения дополнительной информации см. Кольцевое промежуточное программное обеспечение docs.

18

Ваша проблема связана с настройками по умолчанию-по умолчанию и по умолчанию для сайта. Конфигурация по умолчанию по умолчанию по умолчанию добавляет антивирусную защиту CSRF и любой почтовый запрос, который не включает действительный CSRF-токен, будет заблокирован.

Есть несколько способов, чтобы обойти эту

  1. использования API-умолчанию вместо сайта дефолту. Конфигурация по умолчанию api-defaults предназначена для сайтов, на которых вы обслуживаете веб-API, и включает в себя защиту CSRF, включенную в параметры по умолчанию для сайта, которая предназначена для более традиционного веб-сайта, где почтовые запросы создаются по форме, которая была ранее доставлена через запрос на получение и включает в себя csrf-токен как скрытое поле. Недостатком этого решения является то, что он может также отключить другое промежуточное программное обеспечение, которое вы хотите включить.

  2. Отключите защиту csrf в конфигурации по умолчанию для сайта. Это включает в себя установку соответствующего ключа в карте ложному т.е.
    (wrap-defaults app-routes (assoc-in site-defaults [:security :anti-forgery] false))

0

добавить скрытое поле в форму, например, использовать enlive-HTML:

(ns xxx.html 
    (:use [net.cgrand.enlive-html]) 
    (:require [clojure.string :as str] 
      [ring.util.anti-forgery :refer [anti-forgery-field]])) 

(deftemplate render-page "base.html" 
    [settings] 
    [:form#my-form] (append (html-snippet (anti-forgery-field))) 
    ... 
) 

или вывести его из строя, не рекомендуется , как:

(DEF приложение (обертка-умолчанию приложение-маршруты (ассоциативный на сайте дефолте [: безопасность: анти-подделка] ложный)))

 Смежные вопросы

  • Нет связанных вопросов^_^