Как выполнить @JsonIgnore при условии Specifi c или роли пользователя в Springboot - PullRequest
0 голосов
/ 25 апреля 2020

Привет, я новичок в весенней загрузке. Я хочу реализовать ниже logi c, Как мне этого добиться, скажем, у меня есть модель

class Person {

    // Accessible by Level 3 or Few Roles
    private int id;
    private String name;
    private String address;

    // Accessible by Level 2 or Few Roles
    private String phoneNumber;

    //Accessible by Only Level 1 or Admin Roles 
    private String aadharNo;

    @JsonIgnore
    private LocalDateTime deletedAt;
}

Уровни - это спецификатор, данные которого необходимо экспортировать как JSON по запросу. И приоритет ролей высок, например,

phoneNumber может быть экспортирован для запроса как JSON, если его указать JsonInclude, если уровень доступа 2 и роли является привилегированным пользователем, теперь пользователь с обычной ролью не может получить доступ к этому даже хотя его укажите как Уровень 2.

Как мне этого добиться. Любое предложение?

1 Ответ

1 голос
/ 25 апреля 2020

Вы можете сделать это, используя @JsonView и @RestControllerAdvice .....

class View {
    public static class Level3 {} 
    public static class Level2 extends Level3 {}
    public static class Level1 extends Level2 {}
}

class Person {

    @JsonView(View.Level3.class)
    private int id;
    private String name;
    private String address;

    @JsonView(View.Level2.class)
    private String phoneNumber;

    @JsonView(View.Level1.class) 
    private String aadharNo;

    @JsonIgnore
    private LocalDateTime deletedAt;
}

И добавьте эту конфигурацию для проверки авторизации Spring-Security ...

@RestControllerAdvice
class SecurityJsonViewControllerAdvice extends AbstractMappingJacksonResponseBodyAdvice {

    @Override
    protected void beforeBodyWriteInternal(
      MappingJacksonValue bodyContainer,
      MediaType contentType,
      MethodParameter returnType,
      ServerHttpRequest request,
      ServerHttpResponse response) {
        if (SecurityContextHolder.getContext().getAuthentication() != null
          && SecurityContextHolder.getContext().getAuthentication().getAuthorities() != null) {
            Collection<? extends GrantedAuthority> authorities
              = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
            List<Class> jsonViews = authorities.stream()
              .map(GrantedAuthority::getAuthority)
              .map(AppConfig.Role::valueOf)
              .map(View.MAPPING::get)
              .collect(Collectors.toList());
            if (jsonViews.size() == 1) {
                bodyContainer.setSerializationView(jsonViews.get(0));
                return;
            }
            throw new IllegalArgumentException("Ambiguous @JsonView declaration for roles "
              + authorities.stream()
              .map(GrantedAuthority::getAuthority).collect(Collectors.joining(",")));
        }
    }
}
...