2016-10-28 3 views
1

Привет, У меня есть веб-приложение Aurelia, работающее с Aurelia CLI.Aurelia с защитой от нокаута

Раньше я использовал SystemJS в качестве загрузчика модулей, но поскольку я хочу применить политику безопасности контента для своего приложения, чтобы не разрешать «небезопасную-eval», я перешел на CLI Aurelia, как мне было предложено this question.

Мое приложение - это бывшее приложение Durandal, которое я конвертирую в Aurelia, поэтому он широко использует Knockout. Я использую Aurelia-нокаутирующий плагин (как вы можете видеть в моем main.js)

export function configure(aurelia) { 
    aurelia.use 
     .standardConfiguration() 
     .developmentLogging()   
     .plugin('aurelia-knockout'); 

    return aurelia.start().then(() => aurelia.setRoot()); 
} 

и я установил как нокаут и нокаут-безопасный-связывание пакетов НПХ и сконфигурированные их в aurelia.json файл:

"dependencies": [ 
      "aurelia-binding", 
      "aurelia-bootstrapper", 
      "aurelia-dependency-injection", 
      "aurelia-event-aggregator", 
      "aurelia-framework", 
      "aurelia-history", 
      "aurelia-history-browser", 
      "aurelia-loader", 
      "aurelia-loader-default", 
      "aurelia-logging", 
      "aurelia-logging-console", 
      "aurelia-metadata", 
      "aurelia-pal", 
      "aurelia-pal-browser", 
      "aurelia-path", 
      "aurelia-polyfills", 
      "aurelia-route-recognizer", 
      "aurelia-router", 
      "aurelia-task-queue", 
      "aurelia-templating", 
      "aurelia-templating-binding", 
      { 
      "name": "text", 
      "path": "../scripts/lib/text" 
      }, 
      { 
      "name": "aurelia-templating-resources", 
      "path": "../node_modules/aurelia-templating-resources/dist/amd", 
      "main": "aurelia-templating-resources" 
      }, 
      { 
      "name": "aurelia-templating-router", 
      "path": "../node_modules/aurelia-templating-router/dist/amd", 
      "main": "aurelia-templating-router" 
      }, 
      { 
      "name": "aurelia-knockout", 
      "path": "../node_modules/aurelia-knockout/dist/amd", 
      "main": "aurelia-knockout" 
      }, 
      { 
      "name": "knockout", 
      "path": "../node_modules/knockout/build/output", 
      "main": "knockout-latest" 
      }, 
      { 
      "name": "knockout-secure-binding", 
      "path": "../node_modules/knockout-secure-binding/dist", 
      "main": "knockout-secure-binding.min" 
      }, 
      { 
      "name": "aurelia-testing", 
      "path": "../node_modules/aurelia-testing/dist/amd", 
      "main": "aurelia-testing", 
      "env": "dev" 
      } 
     ] 

Я знаю, что я должен использовать следующий код (как я сделал в моем старом приложении Дюрандаль), чтобы активировать нокаут безопасных привязок:

var options = { 
     attribute: "data-bind",  // default "data-sbind" 
     globals: window,    // default {} 
     bindings: ko.bindingHandlers, // default ko.bindingHandlers 
     noVirtualElements: false  // default true 
    }; 
ko.bindingProvider.instance = new ko.secureBindingsProvider(options); 

, но я не знаю, как использовать его в этом новом Aure lia app, или вообще как сделать плагин aurelia-knockout использовать безопасную привязную версию нокаута. Я попытался изменения моего main.js файл, как это:

export function configure(aurelia) {   
    var options = { 
     attribute: "data-bind",  // default "data-sbind" 
     globals: window,    // default {} 
     bindings: ko.bindingHandlers, // default ko.bindingHandlers 
     noVirtualElements: false  // default true 
    }; 
    ko.bindingProvider.instance = new ko.secureBindingsProvider(options); 

    aurelia.use 
     .standardConfiguration() 
     .developmentLogging()   
     .plugin('aurelia-knockout'); 

    return aurelia.start().then(() => aurelia.setRoot()); 
} 

или даже настройки Аурелия-knockout.js файла в модуле NPM, вставив безопасное связывающее определение непосредственно перед этой линией

ko.applyBindings(executionContext, this.element); 

, но даже если у меня нет ошибок сборки (я использую команду «au build»), ни одно из вышеописанных действий не было выполнено.

ОБНОВЛЕНИЕ

Я вставил ко безопасного связывания код инициализации непосредственно внутри

node_modules\aurelia-knockout\dist\amd\aurelia-knockout-custom-attribute.js 

и я добавил ссылку на защищенный модуль связывания в 1-й линии, как так

define(['exports', 'aurelia-dependency-injection', 'aurelia-templating', 'knockout-secure-binding'], function (exports, _aureliaDependencyInjection, _aureliaTemplating, _knockoutSecureBinding) { 

и теперь я получаю эту ошибку:

Unhandled rejection TypeError: ko.secureBindingsProvider is not a constructor 

как если бы защищенный модуль привязки не был обнаружен/загружен.

В любом случае, я не думаю, что волнение вокруг «построенной» версии node_module является идеальным решением, я просто ищу способ заставить его работать. Все еще с нетерпением жду лучших предложений.

ответ

0

Ok, я нашел рабочий раствор:

во-первых, в aurelia.json файле я определяю свойство «загрузчика» так:

"loader": { 
     "type": "require", 
     "configTarget": "vendor-bundle.js", 
     "includeBundleMetadataInConfig": "auto", 
     "config": { 
     "waitSeconds": 0, 
     "paths": { 
      "jquery": "../scripts/lib/cdn/jquery-3.1.0.min", 
      "knockout": "../scripts/lib/knockout-3.4.0"   
     } 
     }, 
     "plugins": [ 
     { 
      "name": "text", 
      "extensions": [ 
      ".html", 
      ".css" 
      ], 
      "stub": true 
     } 
     ] 
    }, 

таким образом, у меня есть определенные Нокаут «глобально».Свойство «расслоения» определяется так:

"bundles": [ 
     { 
     "name": "app-bundle.js",   
     "source": [ 
      "[**/*.js]", 
      "**/*.{css,html}" 
     ] 
     }, 
     { 
     "name": "vendor-bundle.js", 
     "prepend": [ 
      "node_modules/bluebird/js/browser/bluebird.core.js",   
      "scripts/lib/require.js" 
     ], 
     "dependencies": [ 
      "aurelia-binding", 
      "aurelia-bootstrapper", 
      "aurelia-dependency-injection", 
      "aurelia-event-aggregator", 
      "aurelia-fetch-client", 
      "aurelia-framework", 
      "aurelia-history", 
      "aurelia-history-browser", 
      "aurelia-loader", 
      "aurelia-loader-default", 
      "aurelia-logging", 
      "aurelia-logging-console", 
      "aurelia-metadata", 
      "aurelia-pal", 
      "aurelia-pal-browser", 
      "aurelia-path", 
      "aurelia-polyfills", 
      "aurelia-route-recognizer", 
      "aurelia-router", 
      "aurelia-task-queue", 
      "aurelia-templating", 
      "aurelia-templating-binding", 
      { 
      "name": "text", 
      "path": "../scripts/lib/text" 
      }, 
      { 
      "name": "aurelia-templating-resources", 
      "path": "../node_modules/aurelia-templating-resources/dist/amd", 
      "main": "aurelia-templating-resources" 
      }, 
      { 
      "name": "aurelia-templating-router", 
      "path": "../node_modules/aurelia-templating-router/dist/amd", 
      "main": "aurelia-templating-router" 
      }, 
      { 
      "name": "aurelia-knockout", 
      "path": "../node_modules/aurelia-knockout/dist/amd", 
      "main": "aurelia-knockout" 
      },   
      { 
      "name": "aurelia-testing", 
      "path": "../node_modules/aurelia-testing/dist/amd", 
      "main": "aurelia-testing", 
      "env": "dev" 
      }, 
      { 
      "name": "icheck", 
      "path": "../node_modules/icheck", 
      "main": "icheck.min" 
      }, 
      { 
      "name": "filesaver.js", 
      "path": "../node_modules/filesaver.js", 
      "main": "FileSaver.min" 
      } 
     ] 
     } 

Теперь я загружаю все плагины, которые мне нужны внутри main.js перед запуском приложения, и добавить соответствующие плагины к globak переменной «Ко»:

export function configure(aurelia) {  
     aurelia.use 
      .standardConfiguration()   
      .globalResources('views/panel_header.html')   
      .plugin('aurelia-knockout'); 

     aurelia.use.developmentLogging(); 
     var prefix = '../'; 
     var scripts = [ 
      prefix + "/scripts/lib/breeze.debug", 
      prefix + "/scripts/lib/knockout-secure-binding", 
      prefix + "/scripts/lib/knockout.binding.handlers", 
      prefix + "/scripts/lib/knockout.wrap", 
      prefix + "/scripts/lib/knockout.dirtyFlag", 
      prefix + "/scripts/lib/knockout-sortable.min" 
     ]; 

     return aurelia.start().then(() => { 
      require(scripts, function(breeze, secureBindingProvider, kbh, wrap, dirtyFlag, sortable) { 
       require([ 
        prefix + "/scripts/lib/breeze.savequeuing", 
       ], function(savequeuing){ 
        ko.bindingProvider.instance = new ko.secureBindingsProvider({ 
    attribute: "data-bind",  // default "data-sbind" 
    globals: window,    // default {} 
    bindings: ko.bindingHandlers, // default ko.bindingHandlers 
    noVirtualElements: false  // default true 
}); 
        ko.wrap = wrap;    
        ko.dirtyFlag = dirtyFlag; 
        ko.sortable = sortable; 
        aurelia.setRoot(); 
       });    
      });      
     });  
    } 

Теперь, когда плагин aurelia-knockout выполняет привязку, он использует экземпляр «нокаут-защищенный привязку» по своему желанию.