gpt4 book ai didi

java - PagingAndSortingRepository如何实现PostFilter?

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:56 24 4
gpt4 key购买 nike

我正在寻找如何将 @PostFilter 注释实现到 PagingAndSortingRepository 接口(interface)

我创建了我的自定义存储库类扩展

public interface PublishableEntityRepository<T, ID extends Serializable>
extends PagingAndSortingRepository<T, ID> {
@PostFilter("hasPermission(filterObject, 'read')")
Page<T> findAll(Pageable var1);
}

然后创建了一个自定义的PermissionEvaluator

public class AccessPermissionEvaluator implements PermissionEvaluator {

@Override
public boolean hasPermission(Authentication authentication, Object o, Object o1) {
boolean hasPermission = false;

if (authentication != null) {
User user = (User) authentication.getPrincipal();
if (((PublishableEntity) o).getStatus().equals(AccessStatus.PUBLISHED)) {
hasPermission = true;
}
}

return hasPermission;
}

@Override
public boolean hasPermission(Authentication authentication, Serializable serializable, String s, Object o) {
return false;
}
}

然而,一个IllegalArgumentException被抛出:

RepositoryRestExceptionHandler - Filter target must be a collection or array type, but was Page 0 of 0 containing UNKNOWN instances

我知道有问题的 filterObject 是一个 Page 类,那么我该如何过滤 Page 内容呢?

最佳答案

找到答案,它是使用 @Query 和带有安全扩展的 SpEL。

@NoRepositoryBean
public interface PublishableEntityRepository<T, ID extends Serializable>
extends PagingAndSortingRepository<T, ID> {
@PostFilter("hasPermission(filterObject, 'read')")
List<T> findAll();

@PostAuthorize("hasPermission(returnObject, 'read')")
T findOne(ID id);

// where entity.status is PUBLISHED or security SpEL with hasRole
@Query("select o from #{#entityName} o where o.status = 'PUBLISHED' " +
"or 1 = ?#{security.hasRole('ROLE_ADMIN') ? 1 : 0}")
Page<T> findAll(Pageable var1);
}

http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#data-query

关于java - PagingAndSortingRepository如何实现PostFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37486896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com