有时,您不希望用户搜索整个索引,而只搜索与其相关的一个子集。
内容可能仅限于特定用户作为私有数据、一组用户、一个组,甚至所有人访问。在索引中处理访问权限可以对谁可以搜索和查看哪些内容进行细粒度的控制。
通过在服务器端应用过滤器,您可以根据用户的角色或任何其他标准来限制对数据的访问。
使用 JWT 添加基于用户的权限
以下是如何使用 JWT 进行基于角色的权限的示例。此示例将使用客户端提供的 JWT 并根据 Auth0 提供的公钥对其进行验证。如果 JWT 有效,则允许用户访问 API。如果 JWT 无效,则拒绝用户访问。JWT 将包含用户的角色,该角色将用于通过 Elasticsearch 过滤器进行过滤,以仅返回用户被允许查看的数据。
前端更改
在此示例中,我们正在
- 将存储在本地存储中的身份验证令牌标头与请求一起传递
const searchClient = Client({
url: "/api/search",
headers: () => ({
auth: "Bearer" + window.localStorage.getItem("token"),
}),
});
后端更改
在此示例中,我们正在
- 验证 JWT 令牌是否有效
- 解码 JWT 令牌以获取用户角色
- 使用
getBaseFilters
过滤仅适用于admin
角色的文档
api-worker.js
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
// Following code is a modified version of that found at https://blog.cloudflare.com/dronedeploy-and-cloudflare-workers/
async function handleRequest(request) {
const isValid = await isValidJwt(request)
if (!isValid) {
// It is immediately failing here, which is great. The worker doesn't bother hitting your API
return new Response('Invalid JWT', { status: 403 })
} else {
const token = await decodeToken(request)
// role could be admin etc
const { role } = token
// This is where you would do your role based permissions using baseFilters
const body = await request.json();
const results = await client.handleRequest(body, {
getBaseFilters: () => {
// filter documents that must have "admin" in field role
return [
{
bool: {
must: [
{
term: {
role: role,
},
}
},
},
},
];
},
});
return new Response(JSON.stringify(results));
}
const response = await fetch(request)
return response
}