我需要获取特定用户可读的所有文档。假设表演者用户为admin
,是否可以使用“标准”查询或某种解决方法?
作为一个例子,要清楚,说存储库中只有两个文档,只有两个用户(admin
旁边)。 ACL就是这样的:
\ Mike | Bob
doc1 | rw | r
doc2 | r | -
我想以admin
执行查询以获取Bob可读的所有文档,因此我希望只有doc1
作为结果。
由于
答案 0 :(得分:2)
如果不遍历整个搜索结果集并检查每个结果的权限,我认为这是不可能的。
正如其他人所说,如果您以用户而非管理员的身份进行搜索,您只会获得允许用户查看的结果。
我认为作为管理员,您可以作为用户进行搜索并查看返回的内容,但如果您有多个用户,如您的示例中所示,这将变得乏味。
答案 1 :(得分:1)
唯一可能的是编写一些Java代码来与另一个runas用户执行查询。
这是一个可用的Java代码,它扩展了默认的Alfresco webscript行为,您可以在其中提交runas参数。如果您创建Java后端Webscript并实现runas函数并执行 SearchService.query ,那么您就可以了。
@Override
protected void transactionedExecute(final WebScript script,
final WebScriptRequest scriptReq, final WebScriptResponse scriptRes)
throws IOException
{
//already authenticated here
//already pass the authentication
//get the runAs Parameter
String runAs = scriptReq.getParameter(runAsParamName);
final String fixCurrentAuthenticatedUser = authenticationService.getCurrentUserName();
RetryingTransactionCallback<Boolean> exampleWork = new RetryingTransactionCallback<Boolean>()
{
public Boolean execute() throws Exception
{
return authorityService.isAdminAuthority(fixCurrentAuthenticatedUser);
}
};
boolean isAdmin = retryingTransactionHelper.doInTransaction(exampleWork);
//only admins are allowed to do that
if ( !isAdmin || runAs == null || runAs == "")
{
//ignore runAs
super.transactionedExecute(script, scriptReq, scriptRes);
return;
}
final RunAsRepositoryContainer thisIsThis = this;
RunAsWork<Object> work = new RunAsWork<Object>()
{
public Object doWork() throws Exception
{
super.transactionedExecute(script, scriptReq, scriptRes);
return null;
}
};
AuthenticationUtil.runAs(work, runAs);
}