无法将Keycloak与Sails整合。能够将Keycloak与Express集成

问题描述:

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

我终于找到了答案此。 问题是,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