我有一个ElasticSearch搜索引擎和一个内部web应用程序。在应用安全模型之前,搜索结果非常快。安全模型限制一些用户访问某些页面。我们有7种“类型”的页面。
我们目前的进程是:
上述方法还不够快。我有一个自动提示搜索,每个查询现在最多需要2秒。
什么是使搜索引擎返回符合安全性的结果的典型方法?另一位开发人员建议我直接将安全权限存储在ElasticSearch本身中(本质上反映了我们的server所拥有的内容)。
编辑:每个记录都有一个页面。我们可以假设200-500名用户和25000+记录。
发布于 2014-08-27 15:36:23
如果我理解正确的话,以前引擎的搜索结果是很快的。现在您可以这样做了,但是之后使用多达7个DB查询和交叉筛选来过滤结果。
显然,问题在于DB查询,或交叉排序和筛选!
下一个问题是-哪个是慢的?DB是一个慢速框吗?您是否对每个DB查询执行一次筛选?通常有很多方法来优化这类任务,在这种情况下,执行计划是您的朋友。
如果问题是DB,那么缓存可能是一个答案--如果安全策略是相对静态的,您可以获取筛选器限制一次,并在用户登录时将其保存到每个用户。如果在DB上过滤速度较慢,那么尝试在web服务器上应用筛选器,因为从原始结果中的每个页面都可以非常快地查找hashmap。
发布于 2014-08-27 21:20:13
我不完全确定我是否理解正确,但我认为您可以将您的7个数据库访问减少到1。
如果安全级别是严格分级的(例如,最高机密、秘密、机密、受限、非机密),则可以通过分配最高机密= 4、机密= 3、机密= 2、限制= 1、非机密= 0来进一步简化。将此记录存储为字段security_level
然后,具有机密权限的用户可以使用security_level <= 2等方式请求结果。
发布于 2015-11-12 13:35:17
在搜索场景中实现安全性的一个实践是这样的。您将定义用户组,并使用这些组来定义对记录的访问。在构建用于搜索的索引时,包括索引中每个组的访问权限(基本上这是记录的ACL )。
然后,您应该有一个存储库,存储哪些用户是哪些组的成员。然后,您可以轻松地检索用户的群成员身份,例如在登录时。
在查询时,您将只在查询中包含组成员,以便它至少需要有一个用户是其成员的组。
在实践中,存储组成员的存储库往往更复杂,因为递归组成员身份。
概括地说:
HTH。
https://softwareengineering.stackexchange.com/questions/254597
复制相似问题