AclsController.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.provectus.kafka.ui.controller;
  2. import com.provectus.kafka.ui.api.AclsApi;
  3. import com.provectus.kafka.ui.mapper.ClusterMapper;
  4. import com.provectus.kafka.ui.model.KafkaAclDTO;
  5. import com.provectus.kafka.ui.model.KafkaAclNamePatternTypeDTO;
  6. import com.provectus.kafka.ui.model.KafkaAclResourceTypeDTO;
  7. import com.provectus.kafka.ui.model.rbac.AccessContext;
  8. import com.provectus.kafka.ui.model.rbac.permission.AclAction;
  9. import com.provectus.kafka.ui.service.acl.AclsService;
  10. import com.provectus.kafka.ui.service.rbac.AccessControlService;
  11. import java.util.Optional;
  12. import lombok.RequiredArgsConstructor;
  13. import org.apache.kafka.common.resource.PatternType;
  14. import org.apache.kafka.common.resource.ResourcePatternFilter;
  15. import org.apache.kafka.common.resource.ResourceType;
  16. import org.springframework.http.ResponseEntity;
  17. import org.springframework.web.bind.annotation.RestController;
  18. import org.springframework.web.server.ServerWebExchange;
  19. import reactor.core.publisher.Flux;
  20. import reactor.core.publisher.Mono;
  21. @RestController
  22. @RequiredArgsConstructor
  23. public class AclsController extends AbstractController implements AclsApi {
  24. private final AclsService aclsService;
  25. private final AccessControlService accessControlService;
  26. @Override
  27. public Mono<ResponseEntity<Void>> createAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
  28. ServerWebExchange exchange) {
  29. AccessContext context = AccessContext.builder()
  30. .cluster(clusterName)
  31. .aclActions(AclAction.EDIT)
  32. .build();
  33. return accessControlService.validateAccess(context)
  34. .then(kafkaAclDto)
  35. .map(ClusterMapper::toAclBinding)
  36. .flatMap(binding -> aclsService.createAcl(getCluster(clusterName), binding))
  37. .thenReturn(ResponseEntity.ok().build());
  38. }
  39. @Override
  40. public Mono<ResponseEntity<Void>> deleteAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
  41. ServerWebExchange exchange) {
  42. AccessContext context = AccessContext.builder()
  43. .cluster(clusterName)
  44. .aclActions(AclAction.EDIT)
  45. .build();
  46. return accessControlService.validateAccess(context)
  47. .then(kafkaAclDto)
  48. .map(ClusterMapper::toAclBinding)
  49. .flatMap(binding -> aclsService.deleteAcl(getCluster(clusterName), binding))
  50. .thenReturn(ResponseEntity.ok().build());
  51. }
  52. @Override
  53. public Mono<ResponseEntity<Flux<KafkaAclDTO>>> listAcls(String clusterName,
  54. KafkaAclResourceTypeDTO resourceTypeDto,
  55. String resourceName,
  56. KafkaAclNamePatternTypeDTO namePatternTypeDto,
  57. ServerWebExchange exchange) {
  58. AccessContext context = AccessContext.builder()
  59. .cluster(clusterName)
  60. .aclActions(AclAction.VIEW)
  61. .build();
  62. var resourceType = Optional.ofNullable(resourceTypeDto)
  63. .map(ClusterMapper::mapAclResourceTypeDto)
  64. .orElse(ResourceType.ANY);
  65. var namePatternType = Optional.ofNullable(namePatternTypeDto)
  66. .map(ClusterMapper::mapPatternTypeDto)
  67. .orElse(PatternType.ANY);
  68. var filter = new ResourcePatternFilter(resourceType, resourceName, namePatternType);
  69. return accessControlService.validateAccess(context).then(
  70. Mono.just(
  71. ResponseEntity.ok(
  72. aclsService.listAcls(getCluster(clusterName), filter)
  73. .map(ClusterMapper::toKafkaAclDto)))
  74. );
  75. }
  76. @Override
  77. public Mono<ResponseEntity<String>> getAclAsCsv(String clusterName, ServerWebExchange exchange) {
  78. AccessContext context = AccessContext.builder()
  79. .cluster(clusterName)
  80. .aclActions(AclAction.VIEW)
  81. .build();
  82. return accessControlService.validateAccess(context).then(
  83. aclsService.getAclAsCsvString(getCluster(clusterName))
  84. .map(ResponseEntity::ok)
  85. .flatMap(Mono::just)
  86. );
  87. }
  88. @Override
  89. public Mono<ResponseEntity<Void>> syncAclsCsv(String clusterName, Mono<String> csvMono, ServerWebExchange exchange) {
  90. AccessContext context = AccessContext.builder()
  91. .cluster(clusterName)
  92. .aclActions(AclAction.EDIT)
  93. .build();
  94. return accessControlService.validateAccess(context)
  95. .then(csvMono)
  96. .flatMap(csv -> aclsService.syncAclWithAclCsv(getCluster(clusterName), csv))
  97. .thenReturn(ResponseEntity.ok().build());
  98. }
  99. }