|
@@ -3,7 +3,10 @@ package com.provectus.kafka.ui.controller;
|
|
import com.provectus.kafka.ui.api.AclsApi;
|
|
import com.provectus.kafka.ui.api.AclsApi;
|
|
import com.provectus.kafka.ui.mapper.ClusterMapper;
|
|
import com.provectus.kafka.ui.mapper.ClusterMapper;
|
|
import com.provectus.kafka.ui.model.KafkaAclDTO;
|
|
import com.provectus.kafka.ui.model.KafkaAclDTO;
|
|
|
|
+import com.provectus.kafka.ui.model.rbac.AccessContext;
|
|
|
|
+import com.provectus.kafka.ui.model.rbac.permission.AclAction;
|
|
import com.provectus.kafka.ui.service.acl.AclsService;
|
|
import com.provectus.kafka.ui.service.acl.AclsService;
|
|
|
|
+import com.provectus.kafka.ui.service.rbac.AccessControlService;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
@@ -16,11 +19,19 @@ import reactor.core.publisher.Mono;
|
|
public class AclsController extends AbstractController implements AclsApi {
|
|
public class AclsController extends AbstractController implements AclsApi {
|
|
|
|
|
|
private final AclsService aclsService;
|
|
private final AclsService aclsService;
|
|
|
|
+ private final AccessControlService accessControlService;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Mono<ResponseEntity<Void>> createAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
|
|
public Mono<ResponseEntity<Void>> createAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
|
|
ServerWebExchange exchange) {
|
|
ServerWebExchange exchange) {
|
|
- return kafkaAclDto.map(ClusterMapper::toAclBinding)
|
|
|
|
|
|
+ AccessContext context = AccessContext.builder()
|
|
|
|
+ .cluster(clusterName)
|
|
|
|
+ .aclActions(AclAction.EDIT)
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ return accessControlService.validateAccess(context)
|
|
|
|
+ .then(kafkaAclDto)
|
|
|
|
+ .map(ClusterMapper::toAclBinding)
|
|
.flatMap(binding -> aclsService.createAcl(getCluster(clusterName), binding))
|
|
.flatMap(binding -> aclsService.createAcl(getCluster(clusterName), binding))
|
|
.thenReturn(ResponseEntity.ok().build());
|
|
.thenReturn(ResponseEntity.ok().build());
|
|
}
|
|
}
|
|
@@ -28,28 +39,56 @@ public class AclsController extends AbstractController implements AclsApi {
|
|
@Override
|
|
@Override
|
|
public Mono<ResponseEntity<Void>> deleteAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
|
|
public Mono<ResponseEntity<Void>> deleteAcl(String clusterName, Mono<KafkaAclDTO> kafkaAclDto,
|
|
ServerWebExchange exchange) {
|
|
ServerWebExchange exchange) {
|
|
- return kafkaAclDto.map(ClusterMapper::toAclBinding)
|
|
|
|
|
|
+ AccessContext context = AccessContext.builder()
|
|
|
|
+ .cluster(clusterName)
|
|
|
|
+ .aclActions(AclAction.EDIT)
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ return accessControlService.validateAccess(context)
|
|
|
|
+ .then(kafkaAclDto)
|
|
|
|
+ .map(ClusterMapper::toAclBinding)
|
|
.flatMap(binding -> aclsService.deleteAcl(getCluster(clusterName), binding))
|
|
.flatMap(binding -> aclsService.deleteAcl(getCluster(clusterName), binding))
|
|
.thenReturn(ResponseEntity.ok().build());
|
|
.thenReturn(ResponseEntity.ok().build());
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Mono<ResponseEntity<Flux<KafkaAclDTO>>> listAcls(String clusterName, ServerWebExchange exchange) {
|
|
public Mono<ResponseEntity<Flux<KafkaAclDTO>>> listAcls(String clusterName, ServerWebExchange exchange) {
|
|
- return Mono.just(
|
|
|
|
- ResponseEntity.ok(
|
|
|
|
- aclsService.listAcls(getCluster(clusterName)).map(ClusterMapper::toKafkaAclDto)));
|
|
|
|
|
|
+ AccessContext context = AccessContext.builder()
|
|
|
|
+ .cluster(clusterName)
|
|
|
|
+ .aclActions(AclAction.VIEW)
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ return accessControlService.validateAccess(context).then(
|
|
|
|
+ Mono.just(
|
|
|
|
+ ResponseEntity.ok(
|
|
|
|
+ aclsService.listAcls(getCluster(clusterName)).map(ClusterMapper::toKafkaAclDto)))
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Mono<ResponseEntity<String>> getAclAsCsv(String clusterName, ServerWebExchange exchange) {
|
|
public Mono<ResponseEntity<String>> getAclAsCsv(String clusterName, ServerWebExchange exchange) {
|
|
- return aclsService.getAclAsCsvString(getCluster(clusterName))
|
|
|
|
- .map(ResponseEntity::ok)
|
|
|
|
- .flatMap(Mono::just);
|
|
|
|
|
|
+ AccessContext context = AccessContext.builder()
|
|
|
|
+ .cluster(clusterName)
|
|
|
|
+ .aclActions(AclAction.VIEW)
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ return accessControlService.validateAccess(context).then(
|
|
|
|
+ aclsService.getAclAsCsvString(getCluster(clusterName))
|
|
|
|
+ .map(ResponseEntity::ok)
|
|
|
|
+ .flatMap(Mono::just)
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Mono<ResponseEntity<Void>> syncAclsCsv(String clusterName, Mono<String> csvMono, ServerWebExchange exchange) {
|
|
public Mono<ResponseEntity<Void>> syncAclsCsv(String clusterName, Mono<String> csvMono, ServerWebExchange exchange) {
|
|
- return csvMono.flatMap(csv -> aclsService.syncAclWithAclCsv(getCluster(clusterName), csv))
|
|
|
|
|
|
+ AccessContext context = AccessContext.builder()
|
|
|
|
+ .cluster(clusterName)
|
|
|
|
+ .aclActions(AclAction.EDIT)
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ return accessControlService.validateAccess(context)
|
|
|
|
+ .then(csvMono)
|
|
|
|
+ .flatMap(csv -> aclsService.syncAclWithAclCsv(getCluster(clusterName), csv))
|
|
.thenReturn(ResponseEntity.ok().build());
|
|
.thenReturn(ResponseEntity.ok().build());
|
|
}
|
|
}
|
|
}
|
|
}
|