Node.js 无法将Keyclope与帆集成。能够将KeyClope与Express集成

Node.js 无法将Keyclope与帆集成。能够将KeyClope与Express集成,node.js,sails.js,keycloak,sails-mongo,Node.js,Sails.js,Keycloak,Sails Mongo,是一个用Java编写的开源身份验证和身份管理解决方案。它提供了一个nodejs适配器,我可以使用它成功地与express集成。以下是有效的路由文件: 'use strict'; module.exports = function(app) { var Keycloak = require('keycloak-connect'); var session = require('express-session'); var memoryStore = new s

是一个用Java编写的开源身份验证和身份管理解决方案。它提供了一个nodejs适配器,我可以使用它成功地与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);

};
正如您在交货订单路由中所看到的,我有两条路由(同一路由的副本)受
keybeapt.protect()
保护。我正试图在帆船上做同样的事情。为此,我有以下问题

a。要将KeyClope集成到express中,需要执行以下操作来保护路由

  • 需要密钥斗篷和快速会话:

    var-keydove=require('keydove-connect')
    
    var session=require('express-session')

  • 为存储会话定义内存存储:

    var memoryStore=new session.memoryStore()

  • 将会话作为中间件包含在express中

    app.use(会话)({
    秘密:“我的秘密”,
    resave:false,
    saveUninitialized:true,
    商店:memoryStore
    }));

  • 启动密钥斗篷:

    var-keydove=新的keydove({
    商店:memoryStore
    });

  • 将KeyClope中间件包括到express中间件中:

    app.use(keydape.com)({
    注销:'/logout',
    管理员:'/'
    }));

  • 使用
    keydeport.Protect()保护路由

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

  • 我需要在帆上建立类似的步骤。我如何在船帆上做这些事情

    我假设http.js是我添加中间件的地方。如果我这样做了,如何访问routes.js中的keydepeat以使用keydepeat.protect()

    例如,我可以通过以下方式添加保护功能:

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

    这是KeyClope的nodejs适配器-

    我终于找到了答案。 问题是keydropage.middleware()返回函数列表,而app.use()对此很满意。 Sails获取http.middleware列表并添加到其中,然后在结果列表上调用app.use。如果只包含keydropeat.middleware(),则会有一个包含函数数组的函数列表。Express忽略数组,因为它不是函数

    您需要将列表扩展为单独的函数。在http的顶部创建一个KeyClope对象并初始化它。 然后将其放在config/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对象内部: KeyClope中间件:KeyClope.middleware(), 并将其添加到订单数组中

    还添加了呼叫保护策略,包括:

    var kc = sails.config.http.keycloak.protect();
    return kc(req, resp, next);
    
    如果你仍然需要解决这个问题,希望这对你有所帮助


    也许Sails应该在调用Express之前接受一个数组并将其展开,我终于找到了答案。 问题是keydropage.middleware()返回函数列表,而app.use()对此很满意。 Sails获取http.middleware列表并添加到其中,然后在结果列表上调用app.use。如果只包含keydropeat.middleware(),则会有一个包含函数数组的函数列表。Express忽略数组,因为它不是函数

    您需要将列表扩展为单独的函数。在http的顶部创建一个KeyClope对象并初始化它。 然后将其放在config/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对象内部: KeyClope中间件:KeyClope.middleware(), 并将其添加到订单数组中

    还添加一个策略来调用protect并包括以下内容:

    var kc = sails.config.http.keycloak.protect();
    return kc(req, resp, next);
    
    如果你仍然需要解决这个问题,希望这对你有所帮助


    也许Sails应该在调用Express之前接受一个数组并将其展开

    上述答案不适用于Sails 1.0。现在,它要求中间件是一个函数,而不是一个数组,并且keydove从keydove.middleware返回一个数组。 以下是似乎有效的方法: 创建一个服务:keydeposervice

    var session=require('express-session');
    var keydove=require('keydove-connect');
    var memoryStore=new session.memoryStore();
    var keydeposeconfig={
    “领域”:“某个领域,
    “身份验证服务器url”:https://server.com/auth",
    “资源”:“某些资源,
    };
    module.exports={
    config:keydeposeconfig,
    setConfig:function(配置){
    返回新的keydape({store:memoryStore},config);
    }
    
    }
    上述答案不适用于Sails 1.0。现在,它要求中间件是一个函数,而不是一个数组,并且keydove从keydove.middleware返回一个数组。 以下是似乎有效的方法: 创建一个服务:keydeposervice

    var session=require('express-session');
    var keydove=require('keydove-connect');
    var memoryStore=new session.memoryStore();
    var keydeposeconfig={
    “领域”:“某个领域,
    “身份验证服务器url”:https://server.com/auth",
    “资源”:“某些资源,
    };
    module.exports={
    config:keydeposeconfig,
    setConfig:function(配置){
    返回新的keydape({store:memoryStore},config);
    }
    
    }
    还有一个注意事项:您可以有一个函数在中间件列表上迭代,并让sail调用该函数。这可以包含在keydove连接库中。如何在sails中使用keydove.enforcer?它必须在哪里使用?有什么例子吗?谢谢,还有一个注意事项:您可以有一个在中间件列表上迭代的函数,并让Sails调用该函数。这可以包含在keydove连接库中。如何在sails中使用keydove.enforcer?它必须在哪里使用?有什么例子吗?非常感谢。