在Node.js中借助Elasticsearch ClusterClient检查用户是否拥有指定角色
检查用户是否拥有指定角色
现有函数的问题
你当前的函数无法正确检查当前登录用户的角色,原因是clusterClient.asInternalUser.security.getUser()在不带参数调用时,会返回Elasticsearch中所有用户的信息,而非发起当前请求的登录用户。用这个结果判断角色,逻辑完全不成立。
获取当前登录用户信息的最佳方法
在Kibana插件的路由处理逻辑中,无需额外调用Elasticsearch的用户查询接口,context对象已经内置了当前登录用户的完整信息。直接通过context.core.security.user(Kibana 7.x+ 核心重构后的版本)或context.security.user(旧版本)即可获取当前用户的详情,包括角色列表。
修正后的代码示例
const checkUserRole = (router, clusterClient) => { router.post( { path: '/api/check-user-role', validate: false, options: { authRequired: true } // 强制要求用户登录,未登录请求直接返回401 }, async (context, request, response) => { try { // 从context获取当前登录用户 const currentUser = context.core.security.user; // 检查用户是否包含目标角色 const hasRole = currentUser.roles.includes('X'); return response.ok({ body: { hasRole } }); } catch (error) { return response.badRequest({ body: { message: error.message } }); } } ); };
额外说明
- 版本适配:如果你的Kibana版本是7.x之前的旧版本,将
context.core.security.user替换为context.security.user即可。 - 权限拦截:路由配置中加入
authRequired: true后,Kibana会自动拦截未登录的请求,无需在处理函数中额外判断用户是否存在。 - 避免冗余调用:使用
context内置的用户信息,既不需要额外的ES请求开销,也能准确获取当前请求的用户数据,是Kibana插件中获取当前用户的标准方式。
内容的提问来源于stack exchange,提问作者Bertug
相关产品推荐
相关产品推荐

