문제

저는 프런트 엔드에서 Flex/Flash와 함께 Java - Ibatis 및 mySQL을 사용하고 있습니다.사용자 역할에 따라 쿼리에 크리테리아와 테이블을 동적으로 추가할 수 있어야 한다는 요구 사항이 하나 있습니다.여기에 예가 있습니다

동일한 SQL을 호출하는 동일한 객체이지만 역할에 따라 다른 결과

역할 1:직원에 대한 완전한 접근

SELECT * 
  FROM Employee A

역할 2:직원에 대한 접근 제한

SELECT * 
 FROM Employee A
    , SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
  AND B.ROLE_ID = 'ROLE'

동적 SQL을 사용할 수 있습니다.

    SELECT * 
     FROM Employee A
<isNotEmpty property="ROLE" >
        , SECURE_LIST B
    WHERE B.EmployeeID = A.EmployeeID
      AND B.ROLE_ID = #ROLE#
</isNotEmpty>

다른 아이디어?

도움이 되었습니까?

해결책

SELECT *      
FROM Employee A
<isNotEmpty property="ROLE" >
   inner join SECURE_LIST B on B.EmployeeID = A.EmployeeID
</isNotEmpty>
<dynamic prepend="WHERE">
      <isNotEmpty property="ROLE" prepend="AND">
           B.ROLE_ID = #ROLE#
      </isNotEmpty>
</dynamic>

DAO를 만드는 것보다 조금 간단하지만 여전히 모든 매개 변수 맵에 역할을 포함하지 않고 다른 조인 또는 다른 위치 절 요소를 추가 할 수있는 유연성을 제공합니다.

다른 팁

쿼리 내에서 역할을 사용할 때의 문제점은 가능한 모든 쿼리에 대해 쿼리에 대한 인수로 역할을 제공해야 한다는 것입니다.쿼리에 인수를 제공해야 하면 어떻게 되나요?해당 매개변수 클래스/맵에도 역할을 추가해야 합니다.모든 것이 조금 지저분합니다.

저는 한발 물러서서 DAO를 정의하겠습니다.

public interface MyDAO {
  List<Employee> getEmployees();
  ...
}

그런 다음 두 가지 구현을 만듭니다.

public class MyDAOSuper implements MyDAO {
  public List<Employee> getEmployees() {
    // call a query using your first SQL
  }
}

public class MyDAOLimited implements MyDAO {
  public List<Employee> getEmployees() {
    // limited version
  }
}

이 접근 방식의 한 가지 장점은 특정 역할에서 특정 방법을 사용해서는 안 되는 경우 일부 보안 위반 예외를 발생시킬 수 있다는 것입니다.

이제 이를 애플리케이션의 나머지 부분에 연결하는 방법에 대해서는 설명할 세부 사항이 충분하지 않습니다.BlazeDS를 사용 중일 수도 있습니다. 이 경우 다음을 사용하는 것이 좋습니다. BlazeDS와 Spring 통합, 옵션으로 종속성 주입이 열립니다.

또는 간단한 팩토리 메소드(역할 기반)를 사용하여 올바른 DAO를 얻을 수 있습니다.

구성에 따라 이를 연결하는 다른 방법은 의심할 여지가 없습니다.나는 위의 내용이 당신이 제안한 것보다 훨씬 깨끗하다고 ​​생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top