2014-10-24 3 views
13

스프링 데이터 REST에 의해 노출 된 API를 인증하려하고 있습니다. 지금까지 나는 역할 기반 인증 즉를 할 수 있어요 : 스프링 데이터와 함께 스프링 보안 ACL 사용하기 REST

@RepositoryRestResource(path = "book") 
public interface BookRepository extends JpaRepository<Book, Long> { 

    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    <S extends Book> Book save(Book book); 
} 

또한 같은 프로젝트에서 내가 노력하고 ACL 메커니즘과 서비스 계층이있다.

나는 봄 데이터 REST 즉와 포스트 필터 식을 사용할 수 없습니다입니다 :

@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, admin)") 
List<Book> findAll(); 

사람이 봄 데이터 REST와 ACL을 사용하는 경우는 큰 도움이 될 것입니다.

참고 : 나는 개방 문제 아래의 알고 :

https://jira.spring.io/browse/DATAREST-236

https://jira.spring.io/browse/SEC-2409

답변

34

JpaRepository 목록 < 예약 > findall은() 메소드를 미행 한 사용. 그런 다음 CrudRepository를 사용했고 PostFilter가 적용되었습니다. 자세한 내용은

는, 샘플 프로젝트는 GitHub의로 볼 수 있습니다 : https://github.com/charybr/spring-data-rest-acl

ACL 기반 인증이 봄 데이터 REST에 의해 노출 된 개체 아래를 위해 노력하고 있습니다.

import org.springframework.data.repository.CrudRepository; 
import org.springframework.data.rest.core.annotation.RepositoryRestResource; 
import org.springframework.security.access.method.P; 
import org.springframework.security.access.prepost.PostFilter; 
import org.springframework.security.access.prepost.PreAuthorize; 

@RepositoryRestResource(path = "book") 
public interface BookRepository extends CrudRepository<Book, Long> { 

    @PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#book, 'write')") 
    <S extends Book> Book save(@P("book") Book book); 

    @Override 
    @PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, admin)") 
    Iterable<Book> findAll(); 
} 
+5

당신은 시간을내어 자신의 문제에 대한 답변을 게시하기 위해 upvote (1 년 반 후에도)를받을 자격이 있습니다. 고맙습니다 ! –

+0

페이지 가능한 배열 안의 개별 엔티티 값을 기반으로하는'findAll()'함수 내에서'@ PostAuthorize'를 사용하여 결과를 필터링하는 방법은 무엇입니까? –

+0

@ W.M. 페이지 가능'@ PostAuthorize'에 대해서는 좋은 생각이 아닙니다. https://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#data-query를 참조하십시오. –