Controle de acesso ao repositório no Spring Data Rest baseado no princípio do usuário

Estou tentando implementar o controle de acesso de granulação fina enquanto ainda aproveito o restante dos dados do Spring.

Estou trabalhando para garantir umaCrudRepository para que os usuários possam modificar ou inserir apenas dados que pertencem a eles. Estou fazendo uso de@PreAuthorize/@PostAuthorize e@PreFilter/@PostFilter para bloquear o acesso ao principal atual.

Até agora, meu repositório se parece com isso.

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();

}

Embora isso seja um pouco tedioso, parece conseguir o que eu estou procurando. (Se alguém souber uma maneira melhor, não hesite em me avisar!)

Onde eu estou tendo problemas é comdelete(), count() eexists()

    @Override
    long count();

    @Override
    void delete(Integer integer);

    @Override
    void delete(MyObject entity);

    @Override
    void deleteAll();

    @Override
    boolean exists(Integer integer);

Esses métodos levam umInteger Parâmetro de identificação ou nenhum. Parece que eu teria que primeiro selecionar a entidade com o ID de entrada e depois executar a verificação de autenticação.

Este tipo de autorização é possível dentro do repositório?

obrigado

Editar:

Graças ao ksokol, isso parece estar funcionando agora.

Eu adicionei um novo bean a um@Configuration classe

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

Este feijão se estendeEvaluationContextExtensionSupport e substituigetRootObject para retornar umSecurityExpressionRoot que detém meu diretor 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){};
    }
}

questionAnswers(2)

yourAnswerToTheQuestion