Управление доступом к репозиторию в Spring Data Rest на основе пользовательского принципа

Я пытаюсь реализовать точный контроль доступа к зерну, все еще пользуясь преимуществом данных Spring.

Я работаю над обеспечениемCrudRepository поэтому пользователи могут только изменять или вставлять данные, которые им принадлежат. Я использую@PreAuthorize/@PostAuthorize а также@PreFilter/@PostFilter заблокировать доступ к текущему принципалу.

Пока что мой репозиторий выглядит так.

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

}

Хотя это немного утомительно, похоже, что я достигаю того, что мне нужно. (Если кто-нибудь знает лучший способ, не стесняйтесь, дайте мне знать!)

Где я сталкиваюсь с проблемамиdelete(), count() а такжеexists()

    @Override
    long count();

    @Override
    void delete(Integer integer);

    @Override
    void delete(MyObject entity);

    @Override
    void deleteAll();

    @Override
    boolean exists(Integer integer);

Эти методы либо принимаютInteger Параметр ID или нет вообще. Кажется, мне нужно было бы сначала выбрать объект с идентификатором ввода, а затем выполнить проверку подлинности.

Возможен ли такой тип авторизации в хранилище?

Спасибо

Редактировать:

Благодаря ksokol это, кажется, работает сейчас.

Я добавил новый боб@Configuration учебный класс

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

Этот боб расширяетсяEvaluationContextExtensionSupport и переопределяетgetRootObject вернутьSecurityExpressionRoot это держит мой заказной принципал.

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос