Добрый день!
Jmix 2.7.3
Поймали баг при назначении дочерних ролей, если в проект добавлен add-on multitenancy
Воспроизводится, если:
- создаём пустой проект
- добавляем add-on multitenancy
- обновляем gradle
- добавляем две роли child и role и пытаемся для role назначить дочернюю роль.
Падает тут:
io.jmix.multitenancyflowui.impl.SameTenantRoleAssignmentCandidatePredicate
на tenantProvider.getTenantIdForUser(userDetails)
@Override
public boolean test(UserDetails userDetails, BaseRole baseRole) {
if (RoleSource.ANNOTATED_CLASS.equals(baseRole.getSource())) {
return true;
}
String userTenant = tenantProvider.getTenantIdForUser(userDetails);
// Convert "NO_TENANT" to null to match null tenant of role
userTenant = TenantProvider.NO_TENANT.equals(userTenant) ? null : userTenant;
String roleTenant = baseRole.getTenantId();
return Objects.equals(roleTenant, userTenant);
}
@Override
public String getTenantIdForUser(UserDetails userDetails) {
String tenantIdFieldName = getTenantIdFieldName(userDetails.getClass());
if (tenantIdFieldName == null) {
return TenantProvider.NO_TENANT;
}
String tenantId = (String) ReflectionHelper.getFieldValue(userDetails, tenantIdFieldName);
//noinspection ConstantValue
return tenantId != null ? tenantId : TenantProvider.NO_TENANT;
}
userDetails.getClass() не может выполниться, потому что userDetails из ResourceRoleModelLookupView приходит пустой
protected void loadRoles(@Nullable RoleFilterChangeEvent event) {
List<ResourceRoleModel> roleModels = roleRepository.getAllRoles().stream()
.filter(role -> (event == null || event.matches(role))
&& !excludedRolesCodes.contains(role.getCode())
)
.filter(role -> compositeRoleAssignmentCandidatePredicate.test(user, role))
.map(roleModelConverter::createResourceRoleModel)
.sorted(Comparator.comparing(ResourceRoleModel::getName))
.collect(Collectors.toList());
roleModelsDc.setItems(roleModels);
}
compositeRoleAssignmentCandidatePredicate.test(user, role)) - тут падает.
Если роли назначаются пользователю используется тот же lookup, но в RoleAssignmentView есть resourceRoleModelLookupView.setUser(user);
А в ResourceRoleModelDetailView вызывается просто
@Subscribe("childRolesTable.add")
public void onChildRolesTableAdd(ActionPerformedEvent event) {
DialogWindow<ResourceRoleModelLookupView> lookupDialog = dialogWindows.lookup(childRolesTable)
.withViewClass(ResourceRoleModelLookupView.class)
.build();
List<String> excludedRolesCodes = childRolesDc.getItems().stream()
.map(BaseRoleModel::getCode)
.collect(Collectors.toList());
if (codeField.isReadOnly()) {
excludedRolesCodes.add(getEditedEntity().getCode());
}
lookupDialog.getView().setExcludedRoles(excludedRolesCodes);
lookupDialog.open();
}
и user остаётся пустым