대부분의 메서드가 상속되므로 @ 리포지토리 인터페이스에서 @PreAuthorize 주석을 사용하여 스프링 데이터 저장소를 보호하려고합니다. 모든 메서드가 보안을 유지합니다. 결과적으로 Spring 인터페이스에서 상속받은 모든 메소드가 내 인터페이스에 포함 된 모든 맞춤 메소드가 보안을 얻습니다. 슈퍼 인터페이스를 확장하는 간단한 구성 요소 인터페이스에서 동일한 것을 적용하면 올바르게 작동합니다. 이것이 스프링 보안인지 스프링 데이터인지 확실하지 않습니다. 나는 이것을 이해하는 데 도움이 될 것입니다. 작업 서비스 설정 및 작동하지 않는 Spring 데이터 저장소에 대한 단위 테스트가있는 예제는 http://forum.springsource.org/showthread.php?133083-Using-PreAuthorize-on-SpringData-repositories에서 다운로드 할 수 있습니다. 실패한 testSuperRepositoryWithUser는 AccessDeniedException을 가져야하지만 @PreAuthorize 주석은 JpaRepository 인터페이스에 적용되지 않습니다.SpringData 저장소에서 @PreAuthorize 사용하기
답변
기본적으로 스프링은 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()에 대해 다른 보안 권한을 원합니다. 보안 계층이 리포지토리에 적용되면 불가능합니다. 따라서 보안 주석을 서비스에 적용하면 아무 문제가 없습니다.
나는 cglib를 시도했지만 작동하지 않을 것이다. AspectJ는 구체적인 클래스에서 작동하므로 옵션이 아닙니다. 아키텍처 관점에서 동의하지만 필자는 OSGI 서비스 인 경우 저장소를 노출하고 누가 (사용자 또는 서비스)에서 호출하는지 제어 할 수 있습니다. 직접 저장소 메서드를 보호 할 수있는 기능이 없으면 서비스 IF에 나와있는 스프링 데이터를 복제해야하므로 사소한 불편 함이있는 동일한 메서드를 노출하고 보안하는 서비스와 함께 묶어야합니다. –
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> {}
- 1. SpringData 확장 JpaSpecificationExecutor 오류
- 2. Maven/SpringData/Neo4J : Gremlin 1.4를 추가하십시오.
- 3. SpringData MongoDB를 통한 검증 방법
- 4. NoSuchBeanDefinitionException @PreAuthorize 주석을 추가 할 때
- 5. SpringData Neo4J - 리포지토리가 @GraphId를 변경하지 않습니까?
- 6. Symfony 2 + JMSSecurityExtraBundle : @PreAuthorize ('permitAll')이 작동하지 않습니다.
- 7. openCV SVN 저장소 사용하기
- 8. SpringData MongoB MongoTemplate.findAndModify가 포함 된 객체에 "_class"값을 설정하지 않았습니다.
- 9. git 저장소에서 "unrm"하거나 하나의 저장소에서 다른 저장소로 파일 이동
- 10. GIT 저장소에서 svn-checkout
- 11. EF 저장소에서 속성 제외
- 12. svn 저장소에서 프로젝트 실행
- 13. 중앙 저장소에서 DLL을로드하는 방법
- 14. svn 저장소에서 파일 복사
- 15. 실수로 Git 저장소에서 제거되었습니다.
- 16. maven2 저장소에서 프로젝트 만들기
- 17. 데이터 저장소에서 데이터로드
- 18. 저장소에서 Thumbs.db 파일 제거
- 19. Subversion 저장소에서 소스 내보내기
- 20. 폴더에 폴더 넣기 - 저장소에서
- 21. 기본 저장소에서 포크로 병합
- 22. SVN 저장소에서 검색
- 23. 힘내 : 저장소에서 원격으로 당기기
- 24. 데이터 저장소에서 병합 정렬?
- 25. Mercurial - 다른 저장소에서 변경하기
- 26. 저장소에서 파일을 공유하는 방법
- 27. 내부 저장소에서 파일 삭제
- 28. 로컬 저장소에서 sharpsvn 사용
- 29. 파일 및 저장소에서 읽음
- 30. Maven 저장소에서 올바른 JAR의 올바른 버전 찾기
같은 문제는 xml 구성에서 protect-pointcut을 사용하여 보안을 사용할 수있는 경우에도 적용됩니다. –
"Repository1.findAll() 및 Repository2.findAll()에는 허용되는 역할 목록이 다릅니다.") 또는 단순화 된 (모든 저장소의 모든 findAll() 메서드는 허용되는 역할 목록이 동일합니다) 일반적인 경우가 있습니까? –