2014-12-08 2 views
0

우리 프로젝트에서 우리는 봄, JPA & 최대 절전 모드를 MySQL을 통해 사용하고 있습니다. 각 사용자별로 사용 ​​권한이있는 DB 테이블이 있습니다. 이 테이블은 시스템 전체에 많은 영향을 미칩니다. 모든 권한을 가진 "수퍼 유저"/ admin을 추가해야합니다. 이 관리 사용자가 작성한 모든 쿼리는이 관리 사용자에 대한 사용 권한 테이블을 사용 권한 테이블과 같이 "시뮬레이트"합니다.특정 사용자에 대한 DB 쿼리 변경

예를 들어 : DB를 테이블 인 -

entityId | userId 

우리는이 개 단체가 있고, 사용자 # 17 그들에게 권한이있는 경우, 행이

1 | 17 
2 | 17 

는 관리자에게 말하게 될 것이다 사용자는 사용자 # 20입니다. 이 테이블에 행을 추가하고 싶지 않습니다. 이 테이블에 액세스 할 때마다 "임시 행"이 추가되기를 원합니다. 나는 다음과 같은 쿼리가있는 경우 예를 들어 은 :

select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p) 

또는

select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p where 1=1 or p.userId = :userId) 
:

select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p where p.userId = :userId) 

을 내가 로그인 한 사용자 경우는 관리자 사용자인지 원하는 쿼리는 모양을

이것을 구현하는 방법에 대한 조언이 있으십니까?

+0

최대 절전 모드의 개념을 가지고 : 당신은이 논리에 대한 중앙 방법을 가지고 있지만 하나의 방법이없는 경우

TypedQuery<MyEntity> query = null; if (crtUser.getId() != 20) { query = entityManager.createQuery("select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p p.userId = :userId)", MyEntitiy.class); } else { query = entityManager.createQuery("select e from MyEntity e", MyEntitiy.class); } 

, 당신은 다음과 같은 시도 할 수 [필터] (http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch19.html#objectstate-filters)를 사용하여 쿼리에 동적으로 절을 추가 할 수 있습니다. 우리는 우리 프로젝트 중 하나에서 이것을 성공적으로 수행했습니다. 일반 사용자의 경우 데이터는 볼 수있는 것으로 제한되어 있었고 관리자는 추가 절을 추가하지 않았습니다. –

+0

또 다른 옵션은 데이터베이스 필터 대신 Spring Security를 ​​사용하는 것입니다. Spring Security를 ​​사용하여 오브젝트에 ACL을 적용 할 수 있습니다. 그것은 설치하는 데 어려움이있을 수 있지만 큰 결과 집합이있을 때 성능이 저하 될 수 있습니다. –

답변

0

권한을 확인하는 중앙 방법이 있다고 가정 해 보겠습니다. 그렇다면, 단순히 시도 :

query = entityManager.createQuery("select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p p.userId = :userId) OR :userId=20", MyEntitiy.class); 
+0

아니요, 우리는 중심적인 장소가 없습니다. 우리가 하나 있다면, 나는이 질문을하지 않을 것이다 :) – yonatan

관련 문제