programing

연결 풀을 안전하게 래핑

css3 2023. 7. 19. 21:31

연결 풀을 안전하게 래핑

응용 프로그램에서 보다 엄격한 액세스 제어를 수행할 수 있도록 행 수준 보안을 구현하려고 합니다.

중 하나는 Oracle의 Database로,의 Virtual Private Database 및 Oracle의 Private Database를 행합니다.whereㅠㅠ 있기 내에서 .웹 환경에 있기 때문에 Oracle 내에서 단일 요청의 스레드 내에 특수 컨텍스트를 설정해야 합니다.서비스 계정으로 연결 풀링을 사용합니다.

저는 이클립스 링크와 최대 절전 모드를 조사하기 시작했습니다.이클립스 링크는 이 모델에 딱 맞는 이벤트가 있는 것 같습니다.

여기에는 최대 절전 모드에서 마이그레이션하는 작업이 포함됩니다. 이 작업은 문제가 되지 않지만 이러한 이벤트에 대해 EL에 바인딩됩니다.

Oracle은 Web Logic 제품의 데이터 소스 수준에서 구현한다는 것을 의미하는 것으로 보입니다.

컨텍스트는 WebLogic 데이터 소스 코드에 의해 설정 및 삭제됩니다.

질문:데이터 소스 수준에서 몇 가지 일련의 이벤트로 이 작업을 수행하는 것이 더 적합합니까?제가 가장 신경써야 할 이벤트나 방법은 무엇입니까?

추가된 질문:일부 사용자 지정 데이터를 사용하여 Oracle 컨텍스트를 안전하게 초기화하려면 연결 풀을 어떻게 확장합니까?저는 Apache에 대해 알아보고 있는데, Basic DataSource를 확장해도 Spring이 완료되었을 때 연결을 정리할 수 있는 어떤 것에도 액세스할 수 없는 것 같습니다.

연결을 설정하고 연결 풀을 종료/들어갈 때 연결을 정리해야 합니다.저는 제품의 미묘한 균형을 깨서 아무도 그것을 망칠 수 없는 매우 간단한 구현을 희망합니다.

- Specifically we are currently using Apache Commons DBCP Basic Data Source

이를 통해 다양한 방법으로 데이터베이스에 연결하고 보안을 강화할 수 있습니다.그러나 작업할 만한 좋은 예나 이벤트가 보이지 않으며, 보안 라이프사이클을 직접 실행하는 것은 결코 좋은 생각이 아닙니다.

저는 결국 Apache 구성 요소의 일부를 확장하여 문제를 해결했습니다.

저먼확습다니했장다니습을 확장했습니다.org.apache.commons.pool.impl.GenericObjectPool그리고 둘 다 오버로드했습니다.borrowObject()그리고.returnObject().java.sql.Connection할 수 안전하게 캐스팅하고 함께 작업할 수 있도록 했습니다.

Oracle VPD를 사용했기 때문에 애플리케이션 컨텍스트에서 정보를 설정할 수 있었습니다.저는 당신이 그것에 대해 더 자세히 읽는 것을 추천합니다.이는 약간 복잡하며 다양한 컨텍스트 수준에서 RAC 노드 간에 데이터를 숨기거나 공유하는 다양한 옵션이 있습니다.시작

본질적으로 제가 한 일은 언스를 생성하여 오라클 내의 세션을 인스턴스화하는 데 사용한 다음 사용자의 액세스 수준을 해당 세션의 변수로 설정하여 오라클 VPD 정책이 이를 읽고 이를 사용하여 행 수준 필터링을 수행하는 데 사용하는 것이었습니다.

저는 그 한 재정된정인스삭제다니했습에서 했습니다.borrowObject()그리고.returnObject()

CallableStatement callStat =
                    conn.prepareCall("{call namespace.cust_ctx_pkg.set_session_id(" + Math.random() + ")}");
                  callStat.execute();

노트는 좋은 말이 아닙니다.

다음은 단순히 확장하는 것이었습니다.org.apache.commons.dbcp.BasicDataSource우선 순위를 지정하여 내 개체 풀을 설정합니다.createConnectionPool()이 방법을 사용하면 필요하지 않은 일부 기능을 사용할 수 없으므로 저보다 더 많거나 적게 다시 작성해야 할 수도 있습니다.

Spring Security ACL과 같은 간단한 개체 수준의 보안 메커니즘을 사용할 수 있습니다.

애플리케이션 계층에서 이 작업을 수행할 수 있습니다.사전 커밋 후크와 사후 읽기 후크가 필요합니다.

사전 커밋 후크는 클라이언트의 데이터가 해당 데이터를 수정할 권한이 있는 사용자에 의해 제공되는지 확인하는 데 사용됩니다.이렇게 하면 권한 없는 사용자가 액세스할 수 없는 데이터를 덮어쓰지 않습니다.

직관적이지는 않지만, 사후 읽기 후크는 클라이언트가 사용자가 볼 수 없도록 해야 하는 데이터에 액세스하지 못하도록 하는 데 사용됩니다.이는 데이터 계층이 아닌 애플리케이션 계층에서 시행되기 때문에 사후 보기에서 발생합니다.애플리케이션은 데이터 계층에서 데이터를 검색할 때까지 호출자가 데이터에 액세스할 수 있는지 여부를 알 수 없습니다.포스트 읽기 후크에서는 로그인한 사용자의 자격 증명을 기준으로 반환된 각 행의 자격 증명을 평가하여 액세스가 허용되는지 여부를 확인합니다.행에서 액세스가 거부되면 예외가 발생하고 데이터가 클라이언트에 반환되지 않습니다.

이러한 방법으로 응용프로그램 수준 보안을 수행하려면 테이블의 각 행을 액세스에 필요한 권한/역할에 연결하고 런타임에 서버에 대한 사용자의 권한을 평가하는 방법이 있어야 합니다.

도움이 되길 바랍니다.

다른 Commons DBCP 데이터 소스 중 하나를 사용하면 제어 능력이 향상됩니다.기본적인 것은 기본: :) org.apache.commons.dbcp.datasources 패키지에 있는 것들은 당신에게 더 세밀한 제어를 제공합니다.

언급URL : https://stackoverflow.com/questions/39856144/safely-wrapping-a-connection-pool