无法将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融入明示下列事情做是为了保护路由
-
要求Keycloak和快速会话:
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 }));
-
启动Keycloak:
var keycloak = new Keycloak({ store: memoryStore });
-
包括keycloak中间件到快递中间件:
app.use(keycloak.middleware({ logout: '/logout', admin: '/' }));
-
保护利用
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);
希望这有助于你仍然需要解决这个问题。
也许帆应该接受一个数组,并呼吁快递
还要说明一点之前展开:可能您在中间件列表进行迭代,并且有帆调用一个函数的函数。这可以包含在keycloak连接库中。 – nswartz