2017-08-01 70 views
1

Keycloak是一個用Java編寫的開源認證和身份管理解決方案。它提供了一個nodejs適配器,我可以使用它來成功與express進行集成。這裏是路線文件,它的工作原理:無法將Keycloak與Sails整合。能夠將Keycloak與Express集成

'use strict'; 

module.exports = function(app) { 
    var Keycloak = require('keycloak-connect'); 
    var session = require('express-session'); 


    var memoryStore = new session.MemoryStore(); 

    app.use(session({ 
      secret: 'mySecret', 
      resave: false, 
      saveUninitialized: true, 
      store: memoryStore 
    })); 

    var keycloak = new Keycloak({ 
      store: memoryStore 
    }); 
    app.use(keycloak.middleware({ 
      logout: '/logout', 
      admin: '/' 
    })); 


    // var lRController = require('../controllers/LRController'); 
    // 
    // app.route('/lrs').get(lRController.list_all_lrs).post(lRController.create_a_lr); 


    var DeliveryOrderController = require('../controllers/DeliveryOrderController'); 
    app.route('/').get(keycloak.protect(), DeliveryOrderController.getAllDos) 
    app.route('/api/dos').get(keycloak.protect(), DeliveryOrderController.getAllDos).post(DeliveryOrderController.createDo); 
    app.route('/api/do').put(DeliveryOrderController.updateDo); 
    app.route('/api/do/:doNumber').get(DeliveryOrderController.getDoByDoNumber); 
    app.route('/api/do/location/:locationId').get(DeliveryOrderController.getDoByLocation); 
    app.route('/api/do/branch/:branchId').get(DeliveryOrderController.getDoByBranch); 
    app.route('/api/do').delete(DeliveryOrderController.deleteDo); 


    var TransportDeliveryOrderController = require('../controllers/TransportDeliveryOrderController'); 

    app.route('/api/tdos').get(TransportDeliveryOrderController.getAllTdos).post(TransportDeliveryOrderController.createTdo); 
    app.route('/api/tdo').put(TransportDeliveryOrderController.updateTdo); 
    app.route('/api/tdo/:tdoNumber').get(TransportDeliveryOrderController.getTdoByTdoNumber); 
    app.route('/api/tdo/status/:status').get(TransportDeliveryOrderController.getTdoByStatus); 
    app.route('/api/tdo/status/:status/do/:doNumber').get(TransportDeliveryOrderController.getTdoByStatusAndDo); 

}; 

正如你可以在交貨單的路線看,我有keycloak.protect()保護的兩條路線(同一線路的複印件)。我正在嘗試在帆中做同樣的事情。爲此我有以下問題。

a。爲了keycloak融入明示下列事情做是爲了保護路由

  1. 要求Keycloak和快速會話:

    var Keycloak = require('keycloak-connect'); var session = require('express-session');

  2. 定義的存儲器存儲中存儲會話:

    var memoryStore = new session.MemoryStore();

  3. 包括快速

    會話中間件app.use(session({ secret: 'mySecret', resave: false, saveUninitialized: true, store: memoryStore }));

  4. 啓動Keycloak:

    var keycloak = new Keycloak({ store: memoryStore });

  5. 包括keycloak中間件到快遞中間件:

    app.use(keycloak.middleware({ logout: '/logout', admin: '/' }));

  6. 保護利用keycloak.protect()

    app.route('/api/dos').get(keycloak.protect(),DeliveryOrderController.getAllDos).post(DeliveryOrderController.createDo);

我需要建立在船帆類似步驟的路線。我如何在帆中做這些事情?

我假設http.js是我添加中間件的地方。如果我這樣做,如何訪問routes.js中的keycloak以使用keycloak.protect()。

比如我可以通過以下方式添加的保護功能:

'/foo': [ 
keycloak.protect(), 
    { controller: 'user', action: 'find' } 
] 

這裏是適配器的NodeJS爲keycloak - https://github.com/keycloak/keycloak-nodejs-connect

回答

1

我終於找到了答案此。 問題是,keycloak.middleware()返回一個函數列表,app.use()很滿意。 Sails獲取http.middleware列表並添加到列表中,並調用app.use。如果你只包含keycloak.middleware(),你有一個包含函數數組的函數列表。 Express由於不是函數而忽略數組。

您需要將列表擴展爲單獨的功能。在http頂部創建一個keycloak對象並初始化它。 然後把這個在配置的底部/ http.js文件:

function expandList() { 
    var newOrder = []; 
    for (let i in module.exports.http.middleware.order) 
    { 
     var label = module.exports.http.middleware.order[i]; 
     var functor = module.exports.http.middleware[label]; 
     if (functor && functor.constructor === Array) { 
      for (let j in functor) { 
       let newlabel = label + "." + j; 
       newOrder.push(newlabel); 
       module.exports.http.middleware[newlabel] = functor[j]; 
      } 
     } else { 
      newOrder.push(label); 
     } 
    }; 
    module.exports.http.middleware.order = newOrder; 
    return ""; 
} 
var result = init(); 

裏面你需要使用http.middleware對象: keycloakMiddleware:keycloak.middleware(), 並將其添加到數組排序。

還添加策略調用保護和包括此:

var kc = sails.config.http.keycloak.protect(); 
return kc(req, resp, next); 

希望這有助於你仍然需要解決這個問題。

也許帆應該接受一個數組,並呼籲快遞

+0

還要說明一點之前展開:可能您在中間件列表進行迭代,並且有帆調用一個函數的函數。這可以包含在keycloak連接庫中。 – nswartz