Control de acceso al repositorio en Spring Data Rest basado en el usuario princpal

Estoy intentando implementar el control de acceso de grano fino mientras sigo aprovechando el descanso de datos de Spring.

Estoy trabajando para asegurar unCrudRepository para que los usuarios solo puedan modificar o insertar datos que les pertenezcan. Estoy haciendo uso de@PreAuthorize/@PostAuthorize y@PreFilter/@PostFilter para bloquear el acceso al principal actual.

Hasta ahora mi repositorio se ve así.

public interface MyRepository extends CrudRepository<MyObject, Integer> {

    @PreAuthorize("#entity.userId == principal.id")
    @Override
    <S extends MyObject> S save(S entity);

    @PreFilter("filterObject.userId === principal.id")
    @Override
    <S extends MyObject> Iterable<S> save(Iterable<S> entities);

    @PostAuthorize("returnObject.userId == principal.id")
    @Override
    MyObject findOne(Integer integer);

    @PostFilter("filterObject.userId == principal.id")
    @Override
    Iterable<MyObject> findAll();

}

Si bien esto es un poco tedioso, parece lograr lo que busco. (Si alguien conoce una mejor manera, ¡no dudes en hacérmelo saber!)

Donde me encuentro con problemas es condelete(), count() yexists()

    @Override
    long count();

    @Override
    void delete(Integer integer);

    @Override
    void delete(MyObject entity);

    @Override
    void deleteAll();

    @Override
    boolean exists(Integer integer);

Estos métodos toman unInteger Parámetro ID o ninguno en absoluto. Parece que primero tendría que seleccionar la entidad con la ID de entrada y luego realizar la verificación de autenticación.

¿Es posible este tipo de autorización dentro del repositorio?

Gracias

Editar:

Gracias a ksokol esto parece estar funcionando ahora.

Agregué un nuevo bean a un@Configuration clase

@Bean
public EvaluationContextExtension securityExtension() {
    return new SecurityEvaluationContextExtensionImpl();
}

Este frijol se extiendeEvaluationContextExtensionSupport y anulagetRootObject devolver unSecurityExpressionRoot eso tiene mi principal personalizado.

public class SecurityEvaluationContextExtensionImpl extends EvaluationContextExtensionSupport {
@Override
public String getExtensionId() {
    return "security";
}

@Override
public Object getRootObject() {
        Authentication authentication =   SecurityContextHolder.getContext().getAuthentication();
        return new SecurityExpressionRoot(authentication){};
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta