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.