AccessController.java 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package com.provectus.kafka.ui.controller;
  2. import com.provectus.kafka.ui.api.AuthorizationApi;
  3. import com.provectus.kafka.ui.model.ActionDTO;
  4. import com.provectus.kafka.ui.model.AuthenticationInfoDTO;
  5. import com.provectus.kafka.ui.model.ResourceTypeDTO;
  6. import com.provectus.kafka.ui.model.UserInfoDTO;
  7. import com.provectus.kafka.ui.model.UserPermissionDTO;
  8. import com.provectus.kafka.ui.model.rbac.Permission;
  9. import com.provectus.kafka.ui.service.rbac.AccessControlService;
  10. import java.security.Principal;
  11. import java.util.Collection;
  12. import java.util.Collections;
  13. import java.util.List;
  14. import java.util.stream.Collectors;
  15. import lombok.RequiredArgsConstructor;
  16. import org.springframework.http.ResponseEntity;
  17. import org.springframework.security.core.context.ReactiveSecurityContextHolder;
  18. import org.springframework.security.core.context.SecurityContext;
  19. import org.springframework.web.bind.annotation.RestController;
  20. import org.springframework.web.server.ServerWebExchange;
  21. import reactor.core.publisher.Mono;
  22. @RestController
  23. @RequiredArgsConstructor
  24. public class AccessController implements AuthorizationApi {
  25. private final AccessControlService accessControlService;
  26. public Mono<ResponseEntity<AuthenticationInfoDTO>> getUserAuthInfo(ServerWebExchange exchange) {
  27. AuthenticationInfoDTO dto = new AuthenticationInfoDTO();
  28. dto.setRbacEnabled(accessControlService.isRbacEnabled());
  29. UserInfoDTO userInfo = new UserInfoDTO();
  30. Mono<List<UserPermissionDTO>> permissions = accessControlService.getUser()
  31. .map(user -> accessControlService.getRoles()
  32. .stream()
  33. .filter(role -> user.groups().contains(role.getName()))
  34. .map(role -> mapPermissions(role.getPermissions(), role.getClusters()))
  35. .flatMap(Collection::stream)
  36. .collect(Collectors.toList())
  37. )
  38. .switchIfEmpty(Mono.just(Collections.emptyList()));
  39. Mono<String> userName = ReactiveSecurityContextHolder.getContext()
  40. .map(SecurityContext::getAuthentication)
  41. .map(Principal::getName);
  42. return userName
  43. .zipWith(permissions)
  44. .map(data -> {
  45. userInfo.setUsername(data.getT1());
  46. userInfo.setPermissions(data.getT2());
  47. dto.setUserInfo(userInfo);
  48. return dto;
  49. })
  50. .switchIfEmpty(Mono.just(dto))
  51. .map(ResponseEntity::ok);
  52. }
  53. private List<UserPermissionDTO> mapPermissions(List<Permission> permissions, List<String> clusters) {
  54. return permissions
  55. .stream()
  56. .map(permission -> {
  57. UserPermissionDTO dto = new UserPermissionDTO();
  58. dto.setClusters(clusters);
  59. dto.setResource(ResourceTypeDTO.fromValue(permission.getResource().toString().toUpperCase()));
  60. dto.setValue(permission.getValue());
  61. dto.setActions(permission.getActions()
  62. .stream()
  63. .map(String::toUpperCase)
  64. .map(ActionDTO::valueOf)
  65. .collect(Collectors.toList()));
  66. return dto;
  67. })
  68. .collect(Collectors.toList());
  69. }
  70. }