Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow user to assign tenant as resource to role #436

Merged
merged 1 commit into from
Jan 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@
import org.apache.pulsar.manager.entity.RoleBindingRepository;
import org.apache.pulsar.manager.entity.RoleInfoEntity;
import org.apache.pulsar.manager.entity.RolesRepository;
import org.apache.pulsar.manager.entity.TenantEntity;
import org.apache.pulsar.manager.entity.TenantsRepository;
import org.apache.pulsar.manager.entity.UserInfoEntity;
import org.apache.pulsar.manager.entity.UsersRepository;
import org.apache.pulsar.manager.service.JwtService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.apache.pulsar.manager.utils.ResourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
Expand Down Expand Up @@ -81,6 +84,9 @@ public LoginController(JwtService jwtService) {
@Autowired
private RoleBindingRepository roleBindingRepository;

@Autowired
private TenantsRepository tenantsRepository;

@ApiOperation(value = "Login pulsar manager")
@ApiResponses({
@ApiResponse(code = 200, message = "ok"),
Expand Down Expand Up @@ -112,7 +118,7 @@ public ResponseEntity<Map<String, Object>> login(
result.put("login", "success");
headers.add("token", token);
headers.add("username", userAccount);
headers.add("tenant", userAccount);

jwtService.setToken(request.getSession().getId(), token);
List<RoleBindingEntity> roleBindingEntities = roleBindingRepository.
findByUserId(userInfoEntity.getUserId());
Expand All @@ -123,6 +129,10 @@ public ResponseEntity<Map<String, Object>> login(
if (!roleIdList.isEmpty()) {
List<RoleInfoEntity> roleInfoEntities = rolesRepository.findAllRolesByMultiId(roleIdList);
for (RoleInfoEntity roleInfoEntity : roleInfoEntities) {
if(roleInfoEntity.getResourceType().equals(ResourceType.TENANTS.name())){
Optional<TenantEntity> tenantEntity = tenantsRepository.findByTenantId(roleInfoEntity.getResourceId());
headers.add("tenant",tenantEntity.get().getTenant());
}
if (roleInfoEntity.getFlag() == 0) {
// Super users can access all types
return new ResponseEntity<>(result, headers, HttpStatus.OK);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import org.apache.pulsar.manager.entity.NamespacesRepository;
import org.apache.pulsar.manager.entity.RoleInfoEntity;
import org.apache.pulsar.manager.entity.RolesRepository;
import org.apache.pulsar.manager.entity.TenantEntity;
import org.apache.pulsar.manager.entity.TenantsRepository;
import org.apache.pulsar.manager.service.RolesService;
import org.apache.pulsar.manager.utils.ResourceType;
import org.hibernate.validator.constraints.Range;
Expand Down Expand Up @@ -59,15 +61,19 @@ public class RolesController {

private final HttpServletRequest request;

private TenantsRepository tenantsRepository;

public RolesController(
RolesRepository rolesRepository,
RolesService rolesService,
NamespacesRepository namespacesRepository,
TenantsRepository tenantsRepository,
HttpServletRequest request) {
this.rolesRepository = rolesRepository;
this.rolesService = rolesService;
this.namespacesRepository = namespacesRepository;
this.request = request;
this.tenantsRepository = tenantsRepository;
}

@ApiOperation(value = "Get the list of existing roles, support paging, the default is 10 per page")
Expand Down Expand Up @@ -228,6 +234,7 @@ public ResponseEntity<Map<String, Object>> deleteRole(@RequestBody RoleInfoEntit
public ResponseEntity<Map<String, Object>> getResourceType() {
Map<String, Object> result = Maps.newHashMap();
Set<String> resourceTypeList = Sets.newHashSet();
resourceTypeList.add(ResourceType.TENANTS.name());
resourceTypeList.add(ResourceType.NAMESPACES.name());
resourceTypeList.add(ResourceType.TOPICS.name());
resourceTypeList.add(ResourceType.SCHEMAS.name());
Expand All @@ -247,18 +254,30 @@ public ResponseEntity<Map<String, Object>> getResource(@PathVariable String reso
Map<String, Object> result = Maps.newHashMap();
String token = request.getHeader("token");
String tenant = request.getHeader("tenant");
String environment = request.getHeader("environment");
Map<String, String> validateResult = rolesService.validateCurrentTenant(token, tenant);
if (validateResult.get("error") != null) {
result.put("error", validateResult.get("error"));
return ResponseEntity.ok(result);
}
List<NamespaceEntity> namespaceEntities = namespacesRepository.findByTenant(tenant);
Set<Map<String, Object>> nameSet = Sets.newHashSet();
for (NamespaceEntity namespaceEntity : namespaceEntities) {
Map<String, Object> namespace = Maps.newHashMap();
namespace.put("name", namespaceEntity.getNamespace());
namespace.put("id", namespaceEntity.getNamespaceId());
nameSet.add(namespace);
if(ResourceType.TENANTS.name().equals(resourceType)){
List<TenantEntity> tenantEntities = tenantsRepository.findByEnvironment(environment);
tenantEntities.forEach(tenantEntity -> {
Map<String, Object> tenantMap = Maps.newHashMap();
tenantMap.put("name", tenantEntity.getTenant());
tenantMap.put("id", tenantEntity.getTenantId());
nameSet.add(tenantMap);
});

} else if(ResourceType.NAMESPACES.name().equals(resourceType)) {
List<NamespaceEntity> namespaceEntities = namespacesRepository.findByTenant(tenant);
for (NamespaceEntity namespaceEntity : namespaceEntities) {
Map<String, Object> namespace = Maps.newHashMap();
namespace.put("name", namespaceEntity.getNamespace());
namespace.put("id", namespaceEntity.getNamespaceId());
nameSet.add(namespace);
}
}
result.put("data", nameSet);
return ResponseEntity.ok(result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ public ResponseEntity<Map<String, Object>> getTenants(
List<RoleInfoEntity> roleInfoEntities = rolesRepository.findAllRolesByMultiId(roleIdList);
List<Long> tenantsIdList = new ArrayList<>();
for (RoleInfoEntity roleInfoEntity : roleInfoEntities) {
tenantsIdList.add(roleInfoEntity.getResourceId());
if(roleInfoEntity.getResourceType().equals(ResourceType.TENANTS.name())) {
tenantsIdList.add(roleInfoEntity.getResourceId());
}
}
if (!tenantsIdList.isEmpty()) {
tenantEntities = tenantsRepository.findByMultiId(tenantsIdList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,9 @@ public void remove(String tenant) {
tenantsMapper.delete(tenant);
}

@Override
public List<TenantEntity> findByEnvironment(String environment) {
return tenantsMapper.findAll(environment);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,7 @@ public interface TenantsRepository {

void remove(String tenant);

List<TenantEntity> findByEnvironment(String environment);

}

Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,8 @@ public interface TenantsMapper {
@Delete("DELETE FROM tenants WHERE tenant = #{tenant}")
void delete(String tenant);

@Select("SELECT tenant, tenant_id as tenantId, admin_roles as adminRoles,allowed_clusters as allowedClusters," +
"environment_name as environmentName " +
"FROM tenants WHERE environment_name = #{environment}")
List<TenantEntity> findAll(String environment);
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,20 @@ public void findByTenantId() {
Assert.assertEquals("test-cluster", getTenantEntity.getAllowedClusters());
Assert.assertEquals("test-environment", getTenantEntity.getEnvironmentName());
}
}

@Test
public void findByEnvironment() {
TenantEntity tenantEntity = new TenantEntity();
tenantEntity.setTenant("test");
tenantEntity.setAdminRoles("test-role");
tenantEntity.setAllowedClusters("test-cluster");
tenantEntity.setEnvironmentName("test-environment");
long tenantId = tenantsRepository.save(tenantEntity);
List<TenantEntity> result = tenantsRepository.findByEnvironment("test-environment");
TenantEntity getTenantEntity = result.get(0);
Assert.assertEquals("test", getTenantEntity.getTenant());
Assert.assertEquals("test-role", getTenantEntity.getAdminRoles());
Assert.assertEquals("test-cluster", getTenantEntity.getAllowedClusters());
Assert.assertEquals("test-environment", getTenantEntity.getEnvironmentName());
}
}