Я искал способы обойти @PreAuthorize, если сам вызываю код, и, к удивлению, работает следующее:
@RepositoryRestResource(excerptProjection = UserSummaryProjection.class)
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
/**
* Saves entity without security checks.
*/
@RestResource(exported = false)
default User saveInternal(User entity) {
return save(entity);
}
@PreAuthorize("@userValidator.hasWritePermission(#user)")
@Override
User save(User user);
}
А потом где-нибудь в коде моего контроллера ..
public @ResponseBody
ResponseEntity<?> controllerMethod(@RequestBody param) {
userRepository.saveInternal(user); //does not PreAuthorize check
userRepository.save(user); //does DO PreAuthorize check
}
Это работает так, как я хочу, но почему это работает? Потому что saveInternal в конечном итоге просто не вызовет save () и поэтому требует проверки?