2.10
使用的什么数据库?MySQL 8.x
使用的哪种方式运行?Docker
在线站点地址 发生了什么?在博客首页,未登录无法搜索到私有文章的内容,此时点击登录后返回主页,仍然无法搜索到私有内容,是否应该在登录之后主动做一次刷新搜索引擎索引的操作?
2.10
使用的什么数据库?MySQL 8.x
使用的哪种方式运行?Docker
在线站点地址 发生了什么?在博客首页,未登录无法搜索到私有文章的内容,此时点击登录后返回主页,仍然无法搜索到私有内容,是否应该在登录之后主动做一次刷新搜索引擎索引的操作?
目前,本地搜索引擎只针对于公开的文章建立了索引,所以无论是否登录,通过搜索引擎都无法搜索出私有文章。
我认为这个地方的实现存在很多问题,首先我确实在搜索框中搜索到了私有文章如图所示(我在搜索之前手动在登录状态下刷新了索引) 只不过在未登录情况下无法点击进入浏览,进入后报404,登录后可以正常浏览私有文章
重构索引调用的应该是这个方法
https://github.com/halo-dev/halo/blob/747cab3aa195c03b87d8ff5174bafe72e5bb3ffa/application/src/main/java/run/halo/app/search/IndicesServiceImpl.java#L41-L43
https://github.com/halo-dev/halo/blob/747cab3aa195c03b87d8ff5174bafe72e5bb3ffa/application/src/main/java/run/halo/app/theme/finders/impl/PostFinderImpl.java#L105-L109
其中postFinder.listAll()
中postPredicateResolver.getPredicate()
是这样写的
https://github.com/halo-dev/halo/blob/747cab3aa195c03b87d8ff5174bafe72e5bb3ffa/application/src/main/java/run/halo/app/theme/router/DefaultQueryPostPredicateResolver.java#L28-L35
32行visiblePredicate.or
也拿到了当前用户的私有文章。
我看这个代码是 #4412 在实现主题端展示作者的私有文章时候加的,可能会导致操作更新索引的用户私有文章被更新到索引当中
感谢 @AirboZH 提供了相关的代码片段。
被动刷新过程中不会判断 owner,所以会过滤掉 private 的文章。但是主动刷新过程不会过滤掉 private 的文章。
/kind bug /area core
考虑为已登录用户提供私有文章的搜索么?
已登录的用户不一定有查看私有文章的权限,例如访客。即使能够搜索到,但仍然无法查看。
我的意思是
A用户的私有文章在A用户登录时,自己可以查询到,但是B用户不能。 B用户的私有文章在B用户登录时,自己可以查询到,但是A用户不能。
已登录用户可以查询到自己的私有文章。
可能在私有知识库等情况会用。如果先不考虑的话,我可以assign这个issue
"能够搜索到" 在某些情况下就已经会暴露一些信息了, 假设我存储了一个GithubToken的字段在私有文章中,当访客不经意搜索了"Github","Token"这2个字段,那么关联出来的索引可能会暴露这个信息
目前,可以先解决掉“主动刷新”后可以搜索到“私有”文章的问题。关于登录用户能够搜索到自己的私有文章的特性,可以另外实现。
@JohnNiang 好的,我会处理这个issue
目前有两个思路,
ReactiveQueryPostPredicateResolver
增加一个pulic文章的PredicaterebuildPostIndices
方法中过滤掉私有文章哪种方式更好呢。我倾向第一种,不用将不必要的数据查询出来再删除掉
我觉得可以考虑在ORM层面做数据权限的过滤,例如MybatisPlus中有一个数据权限过滤器可以用于拼接WHERE条件来实现不同的用户查询到的结果不一样
记得Halo数据库中只有一张extensions
表么。
我猜所有的持久化操作应该是通过ReactiveExtensionClient
这样一个接口来完成的。所以可以没办法和传统的ORM动态SQL或者类似操作一样实现了。
Hi @AirboZH,
IMO,我更倾向第二种方式。修改第一种方式可能会影响到其他功能。
好的,那就在rebuildPostIndices
方法中过滤掉私有文章