2012-12-06 5 views
0

대부분의 메서드가 상속되므로 @ 리포지토리 인터페이스에서 @PreAuthorize 주석을 사용하여 스프링 데이터 저장소를 보호하려고합니다. 모든 메서드가 보안을 유지합니다. 결과적으로 Spring 인터페이스에서 상속받은 모든 메소드가 내 인터페이스에 포함 된 모든 맞춤 메소드가 보안을 얻습니다. 슈퍼 인터페이스를 확장하는 간단한 구성 요소 인터페이스에서 동일한 것을 적용하면 올바르게 작동합니다. 이것이 스프링 보안인지 스프링 데이터인지 확실하지 않습니다. 나는 이것을 이해하는 데 도움이 될 것입니다. 작업 서비스 설정 및 작동하지 않는 Spring 데이터 저장소에 대한 단위 테스트가있는 예제는 http://forum.springsource.org/showthread.php?133083-Using-PreAuthorize-on-SpringData-repositories에서 다운로드 할 수 있습니다. 실패한 testSuperRepositoryWithUser는 AccessDeniedException을 가져야하지만 @PreAuthorize 주석은 JpaRepository 인터페이스에 적용되지 않습니다.SpringData 저장소에서 @PreAuthorize 사용하기

+0

같은 문제는 xml 구성에서 protect-pointcut을 사용하여 보안을 사용할 수있는 경우에도 적용됩니다. –

+0

"Repository1.findAll() 및 Repository2.findAll()에는 허용되는 역할 목록이 다릅니다.") 또는 단순화 된 (모든 저장소의 모든 findAll() 메서드는 허용되는 역할 목록이 동일합니다) 일반적인 경우가 있습니까? –

답변

1

기본적으로 스프링은 JDK 프록시가있는 Bean을 래핑합니다. 이 경우 주석은 인터페이스 메소드에서만 작동합니다. 따라서 좀 더 강력한 프록시 (CGlib 또는 AspectJ)가 필요합니다. 귀하의 사건을 "있는 그대로"수정하게 될지 확신하지 못합니다. 당신은 CGLIB를 위해 시도 할 수 있습니다 :

<security:global-method-security ... proxy-target-class="true" /> 

AspectJ를 들어 :

<security:global-method-security ... mode="aspectj" /> 

를 두 경우 모두 추가 라이브러리와 추가 구성이 필요합니다. 자세한 내용은 AOP Proxies을 참조하십시오.

아키텍처 관점에서 보안 주석을위한 최상의 장소는 서비스 방법입니다. 다음 사례를 고려하십시오. ServiceA.methodA() 및 ServiceB.methodB() 있습니다. 그들은 RepositoryC.methodC()를 사용합니다. 클라이언트는 methodA() 및 methodB()에 대해 다른 보안 권한을 원합니다. 보안 계층이 리포지토리에 적용되면 불가능합니다. 따라서 보안 주석을 서비스에 적용하면 아무 문제가 없습니다.

+1

나는 cglib를 시도했지만 작동하지 않을 것이다. AspectJ는 구체적인 클래스에서 작동하므로 옵션이 아닙니다. 아키텍처 관점에서 동의하지만 필자는 OSGI 서비스 인 경우 저장소를 노출하고 누가 (사용자 또는 서비스)에서 호출하는지 제어 할 수 있습니다. 직접 저장소 메서드를 보호 할 수있는 기능이 없으면 서비스 IF에 나와있는 스프링 데이터를 복제해야하므로 사소한 불편 함이있는 동일한 메서드를 노출하고 보안하는 서비스와 함께 묶어야합니다. –

0

Repository 인터페이스의 모든 메소드에 @PreAuthorize 또는 이와 유사한 주석을 적용 할 수 있으며 메소드가 아닌 인터페이스에 적용 할 수 있습니다.

@PreAuthorize("hasRole('ROLE_SUPERUSER')") 
public interface PersonnelRepository extends PagingAndSortingRepository<Person, Long>{} 

당신은 또한 다른 사람이되는 상속 저장소의 방법을 확보 상속 기본 저장소에 주석을 제공 할 수 있습니다.

@NoRepositoryBean 
@RepositoryRestResource() 
@PreAuthorize("hasAuthority('ROLE_USER')") 
public interface BaseRepository<T, ID extends Serializable> 
    extends PagingAndSortingRepository<T, ID>{} 

이제이 저장소는 모든 방법에서 동일한 보안을 갖게됩니다.

public interface FooRepo extends BaseRepository <Foo, Long> {} 
관련 문제