2014-09-09 3 views
0

После обновления Spring Security до версии 3.2.x функция загрузки файлов Ajax в моем приложении больше не работает. Основываясь на the SS 3.2 documentation, я добавляю $ {_ csrf.parameterName} = $ {_ csrf.token} URL-адрес ajax. Это не помогает. Кроме того, я также стараюсь, чтобы SS пост-метод устанавливался так же, как и последующие.Загрузка файла с помощью Ajax и Spring Secruity

var token = $("meta[name='_csrf']").attr("value"); 
var header = $("meta[name='_csrf_header']").attr("value"); 

//... 
$(document).ready(function() { 
    new AjaxUpload('#uploadButton', { 
     action: "/shop/admin/products/images/upload", 
     name: 'uploadData', 
    beforeSend : function(xhr) { 
    xhr.setRequestHeader("Accept","application/json"); 
    xhr.setRequestHeader("Content-Type", "application/json"); 
    xhr.setRequestHeader(header, token); 
}, 
onSubmit: function(file , ext) {     

      this.disable(); 
      if (! (ext && /^(jpg|png|jpeg|gif|JPG|PNG|JPEG|GIF)$/.test(ext))){ 
       alert('Error: invalid file extension'); 
       return false; // cancel upload 
      }else { 

      // change button text, when user selects file   
      button.text(msg); 

      // If you want to allow uploading only 1 file at time, 
      // you can disable upload button 
      this.disable(); 

      // Uploding -> Uploading. -> Uploading... 
      interval = window.setInterval(function(){ 
       var text = button.text(); 
       if (text.length < 13){ 
        button.text(text + '.');      
       } else { 
        button.text(msg);    
       } 
      }, 200); 
      } 
     }, 
     onComplete: function(file, response) { 
      button.text(msg); 

      window.clearInterval(interval); 

      this.enable(); 

     } 
    }); 
}); 

И HTML код, связанный с:

<button id="uploadButton" type="button" class="btn btn-default" th:text="#{label.upload}"></button> 

Другой вариант упоминается в документации SS является порядок конфигурации фильтра. Конфигурация Java в приложении не имеет конфигурации фильтра. Поэтому этот параметр не может быть применен.

Как справиться с этой проблемой?

+0

Как вы размещаете файл в ajax, используете ли вы библиотеку? Какой API вы используете на стороне сервера, чтобы получить файл? – holmis83

+0

Библиотека загрузки файлов Ajax была из http://valums.com/ajax-upload/. Этот сайт больше не выходит. В течение последних нескольких недель я пытался найти замену библиотеки загрузки файлов Ajax или подключаемого модуля JQuery, который хорошо работает с Spring Security 3.2, чтобы я мог избежать этой проблемы. – vic

+0

Я успешно использую http://malsup.com/jquery/form/ вместе с Spring Security 3.2. – holmis83

ответ

0

Согласно latest Spring Security documentation, код должен быть $("meta[name='_csrf']").attr("content") вместо $("meta[name='_csrf']").attr("value"), который, кажется, имеет смысл, потому что HTML мета тег имеет content атрибут вместо атрибута value.

Не могли бы вы внести это изменение и попробовать еще раз?

+0

Спасибо за указание на шанс. Я знал – vic

+0

... Я делаю изменение, хотя моя форма javascript формы ajax-представления все еще работает с attr («значение»). Изменение для загрузки файла не помогает, к сожалению. Я все еще получаю следующую ошибку: – vic

+0

Отказано в отображении 'http: // localhost: 8080/store/admin/products/images/upload' в фрейме, потому что он установил «X-Frame-Options» в «DENY». Uncaught SecurityError: Не удалось прочитать свойство contentDocument из «HTMLIFrameElement»: нарушение доступа к песочнице: заблокирован фрейм на «http: // localhost: 8080» из обращения к кадру с нулевым значением. Доступ к кадру изолирован песочницей и отсутствует флаг «allow-same-origin». – vic

0

нормальная форма, но обратите внимание на скрытый CSRF:

<form id="myForm" action="upload" method="post"> 
    <input type="file" name="file"> 
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"> 
    <input type="submit" value="Upload file!"> 
</form> 

Ajaxify с jQuery Form Plugin:

$(document).ready(function() { 
    $('#myForm').ajaxForm(function() { 
     alert("File was uploaded!"); 
    }); 
}); 

Последний шаг к успеху: Убедитесь, что вы MultipartFilter до весны безопасности в вашем web.xml , как описано весной Security reference, section CSRF Caveats.

Плагин JQuery Form имеет различные стратегии для загрузки файлов в зависимости от браузера, но вышеприведенное должно работать независимо.

+0

В соответствии с документом Spring Security, либо размещение MultipartFilter до Spring Security, либо включение CSRF-токена в действие позаботится об этой проблеме. В вашем случае я считаю, что первый вариант имеет место. Вы пробовали свой код без настройки фильтра? То, что я ищу, является вторым вариантом решения. – vic

+0

@vic Я не пробовал использовать маркер в действии. – holmis83

+0

Если вы используете подход к настройке фильтра, любая реализация загрузки файлов должна работать. Решение, которое мне нужно, включает в себя токен CSRF в действии, поскольку в моей конфигурации нет настройки фильтра. Возможно, мне придется изучить подход к фильму. – vic

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