sách gpt4 ai đã đi

node.js - 无法将 Keycloak 与 Sails 集成。能够将 Keycloak 与 Express 集成

In lại 作者:太空宇宙 更新时间:2023-11-03 23:02:00 28 4
mua khóa gpt4 Nike

Keycloak是一个用 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);

};

正如您在交货单路由中所看到的,我有两个受 keycloak.protect() 保护的路由(同一路由的副本)。我正在尝试在 sails 中做同样的事情。为此,我有以下问题。

a.要将 keycloak 集成到 Express 中,需要执行以下操作来保护路由

  1. 需要 Keycloak 和快速 session :

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

  2. 定义用于存储 session 的内存存储:

    var memoryStore = new session.MemoryStore();

  3. 将 session 作为中间件包含在express中

    app.use( session ({
    secret :'我的 secret ',
    重新保存:假,
    保存未初始化:true,
    存储:内存存储
    }));

  4. 启动Keycloak:

    var keycloak = new Keycloak({
    存储:内存存储
    });

  5. 将 keycloak 中间件包含到 Express 中间件中:

    app.use(keycloak.middleware({
    注销: '/注销',
    行政: '/'
    }));

  6. sử dụngkeycloak.protect()保护路由

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

我需要在 sails 中建立类似的步骤。我如何在 sails 中做这些事情?

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

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

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

这是 keycloak 的 Nodejs 适配器 - https://github.com/keycloak/keycloak-nodejs-connect

1 Câu trả lời

我终于找到了这个问题的答案。问题是 keycloak.middleware() 返回一个函数列表,而 app.use() 对此感到满意。Sails 获取 http.middleware 列表并将其添加到其中,并对结果列表调用 app.use。如果您只包含 keycloak.middleware(),您将获得一个包含函数数组的函数列表。 Express 会忽略该数组,因为它不是函数。

您需要将列表扩展为单独的函数。在http的顶部创建一个keycloak对象并初始化它。然后将其放在 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];
}
} khác {
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);

如果您仍然需要解决这个问题,希望这对您有所帮助。

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

关于node.js - 无法将 Keycloak 与 Sails 集成。能够将 Keycloak 与 Express 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45434714/

28 4 0
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com