Moim zdaniem dobrą praktyką jest kontrola uprawnień jak najbliżej kodu wykonującego opreację lub danych (przydaje się w dużych projektach). Jeżeli będziesz sprawdzać uprawnienia na poziomie api gateway, to zawsze ktoś się może wstrzelić z boku. Często też wersje samych serwisów mogą sie rozjechać i nagle API jest dostępne dla wszystkich po niefortunnym wdrożeniu.
Jeśli chodzi o sprawdzanie uprawnień użytkownika to polecam użyć @EnableGlobalMethodSecurity(prePostEnabled=true)
i pisać kod tak:
@Controller
public UserManagementController {
@RequestMapping(method = RequestMethod.GET)
@PreAuthorize("hasAuthority('CAN_LIST_USERS')")
public List<RestUser> listUsers() {
// ...
}
@RequestMapping(method = RequestMethod.POST)
@PreAuthorize("hasAuthority('CAN_SUSPEND_USER')")
public void suspendUser(@RequestParam UUID userId) {
// ...
}
}
Dodatkowo polecam używać ról jako kontenerów na uprawnienia (authorities). I w samym kodzie sprawdzać authorities. Przykładowo:
- ROLE_USER_MANAGEMENT zawiera
- CAN_LIST_USERS
- CAN_SUSPEND_USER
- CAN_CHANGE_USER_ROLES
- etc.
Dzięki temu zyskujesz elastyczność. Jeżeli trzeba dodać nową rolę to nie trzeba przerabiać wszystkich aplikacji, tylko definiujesz nową rolę i przypisane do niej uprawnienia.