使用 node.js Keycloak 适配器动态保护 url

Dynamically protecting url using node.js Keycloak adapter

here 中的代码适用于预先知道 url 的基本情况。 添加中间件并启动 express 应用程序后,如何处理 Keycloak 对 url 的动态保护? 我正在考虑通过一些 node.js 模块处理从文件中读取新的 url,该模块将发出事件,然后下面的代码将处理该事件。在事件处理程序的代码中,将添加对 app.all('/new url', keycloak.protect()) 的调用。 我试过了,但它没有按预期工作,因为 app.use('/lap', [some_midleware]) 在新的 app.all('/new url', keycloak.protect() 之前 我想到的唯一方法是通过在 some_midleware

之前插入新的中间件来修改 app._router.stack
var Keycloak = require('keycloak-connect');
var hogan = require('hogan-express');
var express = require('express');
var session = require('express-session');
var fs = require()
var app = express();

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});



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: '/',
  protected: '/protected/resource'
}));

app.all('/url', keycloak.protect())

app.all('*', [some_midleware]) 

据我了解,您想动态添加在示例中的最后一条路线 之前 处理的新路线 (app.use('*', ...))。

您可以使用单独的路由器来做到这一点:

app.all('/url', keycloak.protect())

const router = express.Router();
app.use(router);

app.use('*', [some_midleware])

然后,要添加新的路由处理程序,您可以将它们添加到 router,而不是 app:

router.get('/new url', keycloak.protect());

因为 router 添加在 之前 app.use('*', ...),它总是先处理请求。仅当请求不匹配任何处理程序时,才会在最后一行的处理程序上传递请求。