获取所有租户中的人员
Get people in all tenants
我尝试使用 Java 网络脚本计算所有租户中的人数。此 Web 脚本应作为默认租户的管理员用户调用,并收集每个租户的人员统计信息。
我很难找到租客。 org.alfresco.service.cmr.security.PersonService
的方法 countPeople()
和 getAllPeople()
总是只给我 默认租户 中的人,即使我将此调用包装在 [=14] 中=].
import org.alfresco.repo.security.authentication.AuthenticationContext;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.tenant.MultiTAdminServiceImpl;
import org.alfresco.repo.tenant.Tenant;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PersonService;
// ...
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status) {
final Map<String, Object> model = new HashMap<>();
final Map<String, Map<String, Long>> tenantNameToTenantData = new HashMap<>();
if (tenantAdminService != null) {
for (final Tenant tenant : tenantAdminService.getAllTenants()) {
final String tenantDomain = tenant.getTenantDomain();
final String systemUserName = authenticationContext.getSystemUserName(tenantDomain);
final Map<String, Long> tenantData = AuthenticationUtil.runAs(() -> {
final Map<String, Long> td = new HashMap<>();
final long userCount = (long) personService.countPeople();
td.put("userCount", userCount);
long totalUsage = 0L;
for (NodeRef personNodeRef : personService.getAllPeople()) {
totalUsage += (long) serviceRegistry.getNodeService().getProperty(personNodeRef, ContentModel.PROP_SIZE_CURRENT);
}
totalUsage = totalUsage / (1_024L * 1_024L);
td.put("totalUsage", totalUsage);
return td;
}, systemUserName);
tenantNameToTenantData.put(tenantDomain, tenantData);
}
}
model.put("tenants", tenantNameToTenantData);
return model;
}
调用 authenticationContext.getSystemUserName(tenantDomain)
returns 正确的名字 (System@tenant1
, ...)。
如何在不必显式验证为租户管理员的情况下获取每个租户的人员?
感谢Gragravarr for the hint to use TenantUtil.runAsTenant
。它是这样工作的:
final TenantUtil.TenantRunAsWork<Map<String, Long>> runAsWork = () -> {
final Map<String, String> td = new HashMap<>();
td.put("userCount", (long) personService.countPeople());
long totalUsage = 0L;
for (NodeRef personNodeRef : personService.getAllPeople()) {
totalUsage += (long) serviceRegistry.getNodeService().getProperty(personNodeRef, ContentModel.PROP_SIZE_CURRENT);
}
totalUsage = totalUsage / (1_024L * 1_024L);
td.put("totalUsage", totalUsage);
return td;
};
final Map<String, Long> tenantData =
TenantUtil.runAsTenant(runAsWork, tenantDomain);
我尝试使用 Java 网络脚本计算所有租户中的人数。此 Web 脚本应作为默认租户的管理员用户调用,并收集每个租户的人员统计信息。
我很难找到租客。 org.alfresco.service.cmr.security.PersonService
的方法 countPeople()
和 getAllPeople()
总是只给我 默认租户 中的人,即使我将此调用包装在 [=14] 中=].
import org.alfresco.repo.security.authentication.AuthenticationContext;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.tenant.MultiTAdminServiceImpl;
import org.alfresco.repo.tenant.Tenant;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PersonService;
// ...
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status) {
final Map<String, Object> model = new HashMap<>();
final Map<String, Map<String, Long>> tenantNameToTenantData = new HashMap<>();
if (tenantAdminService != null) {
for (final Tenant tenant : tenantAdminService.getAllTenants()) {
final String tenantDomain = tenant.getTenantDomain();
final String systemUserName = authenticationContext.getSystemUserName(tenantDomain);
final Map<String, Long> tenantData = AuthenticationUtil.runAs(() -> {
final Map<String, Long> td = new HashMap<>();
final long userCount = (long) personService.countPeople();
td.put("userCount", userCount);
long totalUsage = 0L;
for (NodeRef personNodeRef : personService.getAllPeople()) {
totalUsage += (long) serviceRegistry.getNodeService().getProperty(personNodeRef, ContentModel.PROP_SIZE_CURRENT);
}
totalUsage = totalUsage / (1_024L * 1_024L);
td.put("totalUsage", totalUsage);
return td;
}, systemUserName);
tenantNameToTenantData.put(tenantDomain, tenantData);
}
}
model.put("tenants", tenantNameToTenantData);
return model;
}
调用 authenticationContext.getSystemUserName(tenantDomain)
returns 正确的名字 (System@tenant1
, ...)。
如何在不必显式验证为租户管理员的情况下获取每个租户的人员?
感谢Gragravarr for the hint to use TenantUtil.runAsTenant
。它是这样工作的:
final TenantUtil.TenantRunAsWork<Map<String, Long>> runAsWork = () -> {
final Map<String, String> td = new HashMap<>();
td.put("userCount", (long) personService.countPeople());
long totalUsage = 0L;
for (NodeRef personNodeRef : personService.getAllPeople()) {
totalUsage += (long) serviceRegistry.getNodeService().getProperty(personNodeRef, ContentModel.PROP_SIZE_CURRENT);
}
totalUsage = totalUsage / (1_024L * 1_024L);
td.put("totalUsage", totalUsage);
return td;
};
final Map<String, Long> tenantData =
TenantUtil.runAsTenant(runAsWork, tenantDomain);