Cześć, jestem dość raczkującym użytkownikiem spring security. Na podstawie encji i paru metod zasymiluję pewną sytuację i chciałbym dowiedzieć się, czy możliwe jest wykonanie przedstawionej sytuacji z użyciem spring security.

Najpierw uproszczone na potrzeby postu encje:

Account.java

public class Account {

  private int id;
  private String username;
  private String password;
  private String role;
}

Group.java

public class Group {

  private int id;
  private String groupName;
  private int id_group_parent;
}

GroupMember.java

public class GroupMember {

  private int id;
  private int id_account;
  private int id_group;
  private String role;
}

Autentykacji dokonuję w następujący sposób:

    auth.jdbcAuthentication().dataSource(dataSource)
        .usersByUsernameQuery("select username, password, true "
            + " from accounts where username=?")
        .authoritiesByUsernameQuery("select role "
            + "from accounts where username=?")
        .passwordEncoder(bCryptPasswordEncoder());

Natomiast w samym kontrolerze zabezpieczam wykonanie na podanym mapowaniu np. tak:

 @PostMapping("/addNewGroup")
  @PreAuthorize("hasRole('ROLE_ADMIN')")
  public ResponseEntity<?> register(@RequestBody Group group){

    groupService.addNew(group);
    return new ResponseEntity<>(null, HttpStatus.OK);
  }

W Account istnieją 2 role:

  • ROLE_ADMIN
  • ROLE_USER

W GroupMember istnieją 2 role:

  • ROLE_MANAGER
  • ROLE_MEMBER

Zgodnie z tym, by dodać nową grupę dany użytkownik musi mieć rolę ROLE_ADMIN, która pobierana jest z Account. I tak, to działa.
Zakładamy, że w systemie dodane mam 2 grupy:

  • GRUPA_1
  • GRUPA_2

Użytkownik TEST ma w Account rolę ROLE_USER, zatem nie ma możliwości utworzenia nowej grupy.
Admin dodaje do każdej z tych grup użytkownika TEST:

  • w GRUPA_1 daje mu rolę ROLE_MANAGER
  • w GRUPA_2 daje mu rolę ROLE_MEMBER

Chciałbym teraz, aby dzięki temu, że użytkownik TEST ma rolę ROLE_MANAGER w GRUPA_1 mógł dodawać nowe podgrupy, dla grupy GRUPA_1, tzn takie rekordy, w których id_group_parent to id grupy GRUPA_1, natomiast, jeśli użytkownik będzie chciał dodać podgrupę do grupy GRUPA_2 odrzuci jego żądanie, ponieważ nie ma on tam roli ROLE_MANAGER albo gdy spróbuje dodać całkiem nową grupę niebędącą podgrupą GRUPA_1 to również odrzuci jego żądanie.

Nie pytam oczywiście o samą funkcję, jak to zrobić, bo to potrafię. Chodzi mi o samą autoryzację dokonaną za pomocą Spring Security, by zweryfikować, czy dany użytkownik może dodać do tej grupy nowe podgrupy, czy nie. Prosiłbym o sugestie zrobienia czegoś takiego w sposób najbardziej elegancki.