2016-05-27 19 views
2

私は、しかしPagingAndSortingRepositoryにPostFilterを実装するにはどうすればよいですか?

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; 
    } 
} 

をカスタムPermissionEvaluatorクラスを作成した後

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

を拡張し、私のカスタムリポジトリクラスを作成しPagingAndSortingRepositoryインタフェース

@PostFilter注釈を実装する方法を探していますIllegalArgumentExceptionがスローされます。

RepositoryRestExceptionHandler - 0含むUNKNOWNインスタンスのフィルタ対象がコレクションまたは配列型でなければなりませんが、されたページ0

私は問題のfilterObjectがPageクラスなので、どのように私はページに対してフィルタリングないことを知っています内容ですか?

答えて

0

回答があり、セキュリティエクステンションを使用して@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

関連する問題