Skip to content
This repository has been archived by the owner on Mar 31, 2022. It is now read-only.

Commit

Permalink
Rework admin multitenancy role #14
Browse files Browse the repository at this point in the history
  • Loading branch information
plakhov committed Jul 27, 2021
1 parent 3b1dfaa commit 25acef7
Show file tree
Hide file tree
Showing 9 changed files with 108 additions and 199 deletions.
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,21 @@ system entities.
# Predefined Roles

- **tenant-admin-role** - allows user to configure tenants.

**Note**. The role does not allow manage users if you want you should create a role that allows that. For example
```java
@ResourceRole(name = "Multitenancy: user management", code = TenantUserManagementRole.CODE)
public interface TenantUserManagementRole extends TenantManagementRole {

String CODE = "tenant-user-management-role";

@EntityPolicy(entityClass = User.class, actions = {EntityPolicyAction.ALL})
@EntityAttributePolicy(entityClass = User.class, attributes = "*", action = EntityAttributePolicyAction.MODIFY)
@ScreenPolicy(screenIds = {"<UserBrowse_screen_id>", "UserEdit_screen_id"})
@MenuPolicy(menuIds = {"<UserBrowse_screen_id>"})
void createUserAccess();
}
```

# Managing Tenants

Expand Down Expand Up @@ -152,6 +167,9 @@ access to writing native SQL or Groovy code (JMX Console, SQL/Groovy bands in th
@Autowired
private ComboBox<String> tenantIdField;

@Autowired
private TenantProvider tenantProvider;

@Autowired
private MultitenancyUiSupport multitenancyUiSupport;

Expand All @@ -164,6 +182,15 @@ access to writing native SQL or Groovy code (JMX Console, SQL/Groovy bands in th
public void onInit(InitEvent event){
tenantIdField.setOptionsList(multitenancyUiSupport.getTenantOptions());
}

@Subscribe
public void onBeforeShow(BeforeShowEvent event) {
String currentTenantId = tenantProvider.getCurrentUserTenantId();
if (!currentTenantId.equals(TenantProvider.NO_TENANT) && Strings.isNullOrEmpty(tenantIdField.getValue())) {
tenantIdField.setEditable(false);
tenantIdField.setValue(currentTenantId);
}
}

@Subscribe("tenantIdField")
public void onTenantIdFieldValueChange(HasValue.ValueChangeEvent<String> event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import io.jmix.multitenancy.entity.Tenant;
import io.jmix.multitenancyui.MultitenancyUiSupport;
import io.jmix.ui.navigation.UrlRouting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
Expand All @@ -34,13 +33,17 @@
*/
@Component("mten_MultitenancyUiSupport")
public class MultitenancyUiSupportImpl implements MultitenancyUiSupport {
@Autowired
private MultitenancyProperties multitenancyProperties;
@Autowired
private DataManager dataManager;
private final MultitenancyProperties multitenancyProperties;
private final DataManager dataManager;

private static final String TENANT_USERNAME_SEPARATOR = "|";

public MultitenancyUiSupportImpl(MultitenancyProperties multitenancyProperties,
DataManager dataManager) {
this.multitenancyProperties = multitenancyProperties;
this.dataManager = dataManager;
}

@Override
public String getUsernameByUrl(String username, UrlRouting urlRouting) {
if (Strings.isNullOrEmpty(multitenancyProperties.getTenantIdUrlParamName())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,61 @@

package io.jmix.multitenancyui.screen.tenant;

import io.jmix.core.DataManager;
import io.jmix.core.Messages;
import io.jmix.multitenancy.entity.Tenant;
import io.jmix.ui.screen.EditedEntityContainer;
import io.jmix.ui.screen.StandardEditor;
import io.jmix.ui.screen.UiController;
import io.jmix.ui.screen.UiDescriptor;
import io.jmix.ui.component.TextField;
import io.jmix.ui.component.ValidationException;
import io.jmix.ui.screen.*;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.function.Predicate;

@UiController("mten_Tenant.edit")
@UiDescriptor("tenant-edit.xml")
@EditedEntityContainer("tenantDc")
public class TenantEdit extends StandardEditor<Tenant> {

@Autowired
private TextField<String> tenantIdField;

@Autowired
private TextField<String> nameField;

@Autowired
private Messages messages;

@Autowired
private DataManager dataManager;

@Subscribe
public void onInitEntity(InitEntityEvent<Tenant> event) {
tenantIdField.setEditable(true);
}

@Subscribe
public void onBeforeShow(BeforeShowEvent event) {
Tenant editedEntity = getEditedEntity();
initField(tenantIdField,
tenant -> tenant.getTenantId().equals(editedEntity.getTenantId()),
"io.jmix.multitenancyui.screen.tenant/tenantEdit.uniqueTenantId");
initField(nameField,
tenant -> tenant.getName().equals(editedEntity.getName()),
"io.jmix.multitenancyui.screen.tenant/tenantEdit.uniqueName");
}

private void initField(TextField<?> textField, Predicate<Tenant> predicate, String messageKey) {
textField.addValidator(s -> {
boolean exist = dataManager.load(Tenant.class)
.all()
.list()
.stream()
.anyMatch(predicate);
if (exist) {
throw new ValidationException(messages.getMessage(messageKey));
}
});
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
menu-config.mten_Tenant.browse=Tenants
io.jmix.multitenancyui.screen.tenant/tenantBrowse.caption=Tenants
io.jmix.multitenancyui.screen.tenant/tenantEdit.caption=Tenant editor
io.jmix.multitenancyui.screen.tenant/tenantEdit.uniqueName=Name must be unique
io.jmix.multitenancyui.screen.tenant/tenantEdit.uniqueTenantId=Tenant id must be unique
io.jmix.multitenancy.entity/Tenant=Tenant
io.jmix.multitenancy.entity/Tenant.tenantId=Tenant id
io.jmix.multitenancy.entity/Tenant.name=Tenant name
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
<layout spacing="true" expand="editActions">
<form id="form" dataContainer="tenantDc">
<column width="350px">
<textField id="tenantIdField" property="tenantId" required="true"/>
<textField id="tenantIdField" property="tenantId" required="true" editable="false"/>
<textField id="nameField" property="name"/>
</column>
</form>
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

0 comments on commit 25acef7

Please sign in to comment.