这是第一次在这里问问题,因此,如果我忘记提供一些信息或任何其他错误,请原谅.. 抱歉,文字墙。
(也许我完全错了): 我创建了一个后端(仅node.js Bearer),该后端将提供REST api。部分通过前端(密钥斗篷客户端)或某些设备直接使用。 通常,我尝试创建带有大量CRUD的应用程序。用户管理是在keycloak中完成的,只有我将这些请求转发给admin REST Api。其他东西,例如设备……我存储在一个单独的数据库中。 因此,后端是前端和其他用例的抽象层。
到目前为止,一切都很好,但是从一开始就可以检查天气,请求是否来自经过身份验证的人,因此全部通过keycloak.protect()处理。 但是现在我想提供不同的授权级别(由于多租户的原因可能会有所不同,为什么我要通过策略来解决此问题,并为什么要在客户端配置器内部的admin-console中解决此问题),因为普通用户只能访问某些路由并且管理人员应具有对api的完全访问权限,但当然不需要keycloak管理员访问权限。 因此,我为后端客户端启用了服务帐户,并为该帐户分配了realm-admin角色,以便客户端可以访问所有内容,并且我可以自行处理后端客户端内部的授权(使用admin-中的策略,权限等。安慰)。 (以防万一没人得到我在说什么。Fixing应该可以帮助我解决我认为的问题)
app.js
const express = require('express');
const app = express();
const Keycloak = require('keycloak-connect');
const session = require('express-session');
const routes = require('./routes/index');
const kcConfig = {
'realm': 'master',
'bearer-only': true,
'auth-server-url': `https://DOMAIN/auth`,
'ssl-required': 'all',
'resource': 'fm-backend',
'credentials': {
secret: 'SOME_SECRET',
},
'confidential-port': 0,
'policy-enforcer': { //tried with an without this, changed nothing
'enforcement-mode': 'ENFORCING',
},
};
const memoryStore = new session.MemoryStore();
const keycloak = new Keycloak({ memoryStore }, kcConfig);
app.use(keycloak.middleware({ logout: '/api/logout', protected: '/api/gates' }));
// used before, worked for well for authentication
app.use('/api', keycloak.protect(), routes);
// now unfortunately I don't understand how to use keycloak.enforcer() middleware
app.use('/api', keycloak.enforcer({WHAT_COMES_HERE}), routes);
module.exports = app;
我不了解如何使用自己在后端自己的管理控制台中创建的策略,权限和公司。如何执行这些要求?
我尝试检查其他示例和文档,但可以使其正常运行。
我发现的最后一件事是删除了授权api,但是将一个策略执行器添加到了nodejs适配器。在documentation for the policy-enforcer中找不到中间件(keycloak.enforcer({})
)Link1 Link2的文档。
感谢您的帮助:)
答案 0 :(得分:0)
我也没有得到100%的关注,但是我对强制执行器的实现是这样的:
const resource = 'MyProtectedResource';
const scope = 'myScope'; // for example read
const permission = resource + ':' + scope;
keycloak.enforcer(permission, { response_mode: 'token' }); // for your config: app.use('/api', keycloak.enforcer(permission, {response_mode: 'token' }, routes};
我在该客户端的keycloak管理控制台中设置了资源,范围,策略和权限(在“授权”标签下)。您可以在密钥斗篷中的“评估”选项卡中进行操作,以查看资源/范围/策略/权限如何相互影响。
我使用keycloak进行编码的方法是在实际的keycloak-connect库中使用调试来逐步完成授权操作。