@Test void testAggregateNonSystemOrSuperuser() { SecurityContext originalSecurityContext = SecurityContextHolder.getContext(); try { SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); securityContext.setAuthentication( new UsernamePasswordAuthenticationToken("principal", "credentials", emptySet())); AggregateQuery aggregateQuery = mock(AggregateQuery.class); assertThrows( UnsupportedOperationException.class, () -> permissionCheckingDecorator.aggregate(aggregateQuery)); } finally { SecurityContextHolder.setContext(originalSecurityContext); } }
@Override public AggregateResult aggregate(AggregateQuery aggregateQuery) { if (!currentUserIsSuOrSystem()) { throw new UnsupportedOperationException(); } return delegate().aggregate(aggregateQuery); }
PermissionCheckingDecorator extends AbstractRepositoryDecorator<E> { @Override public AggregateResult aggregate(AggregateQuery aggregateQuery) { if (!currentUserIsSuOrSystem()) { throw new UnsupportedOperationException(); } return delegate().aggregate(aggregateQuery); } }
PermissionCheckingDecorator extends AbstractRepositoryDecorator<E> { @Override public AggregateResult aggregate(AggregateQuery aggregateQuery) { if (!currentUserIsSuOrSystem()) { throw new UnsupportedOperationException(); } return delegate().aggregate(aggregateQuery); } PermissionCheckingDecorator(
      Repository<E> delegateRepository, PermissionChecker<E> permissionChecker); }
PermissionCheckingDecorator extends AbstractRepositoryDecorator<E> { @Override public AggregateResult aggregate(AggregateQuery aggregateQuery) { if (!currentUserIsSuOrSystem()) { throw new UnsupportedOperationException(); } return delegate().aggregate(aggregateQuery); } PermissionCheckingDecorator(
      Repository<E> delegateRepository, PermissionChecker<E> permissionChecker); @Override @Nonnull Iterator<E> iterator(); @Override void forEachBatched(Fetch fetch, Consumer<List<E>> consumer, int batchSize); @Override long count(); @Override long count(Query<E> q); @Override Stream<E> findAll(Query<E> q); @Override E findOne(Query<E> q); @Override E findOneById(Object id); @Override E findOneById(Object id, Fetch fetch); @Override Stream<E> findAll(Stream<Object> ids); @Override Stream<E> findAll(Stream<Object> ids, Fetch fetch); @Override void update(E entity); @Override void update(Stream<E> entities); @Override void delete(E entity); @Override void delete(Stream<E> entities); @Override void deleteById(Object id); @Transactional @Override void deleteAll(Stream<Object> ids); @Transactional @Override void deleteAll(); @Override void add(E entity); @Override Integer add(Stream<E> entities); @Override AggregateResult aggregate(AggregateQuery aggregateQuery); }
PermissionCheckingDecorator extends AbstractRepositoryDecorator<E> { @Override public AggregateResult aggregate(AggregateQuery aggregateQuery) { if (!currentUserIsSuOrSystem()) { throw new UnsupportedOperationException(); } return delegate().aggregate(aggregateQuery); } PermissionCheckingDecorator(
      Repository<E> delegateRepository, PermissionChecker<E> permissionChecker); @Override @Nonnull Iterator<E> iterator(); @Override void forEachBatched(Fetch fetch, Consumer<List<E>> consumer, int batchSize); @Override long count(); @Override long count(Query<E> q); @Override Stream<E> findAll(Query<E> q); @Override E findOne(Query<E> q); @Override E findOneById(Object id); @Override E findOneById(Object id, Fetch fetch); @Override Stream<E> findAll(Stream<Object> ids); @Override Stream<E> findAll(Stream<Object> ids, Fetch fetch); @Override void update(E entity); @Override void update(Stream<E> entities); @Override void delete(E entity); @Override void delete(Stream<E> entities); @Override void deleteById(Object id); @Transactional @Override void deleteAll(Stream<Object> ids); @Transactional @Override void deleteAll(); @Override void add(E entity); @Override Integer add(Stream<E> entities); @Override AggregateResult aggregate(AggregateQuery aggregateQuery);  }