연결 풀을 안전하게 래핑
응용 프로그램에서 보다 엄격한 액세스 제어를 수행할 수 있도록 행 수준 보안을 구현하려고 합니다.
중 하나는 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
'programing' 카테고리의 다른 글
파이썬 '버퍼' 유형은 무엇을 위한 것입니까? (0) | 2023.07.19 |
---|---|
가져오기 오류: libSM.so .6: 공유 개체 파일을 열 수 없습니다.해당 파일 또는 디렉터리가 없습니다. (0) | 2023.07.19 |
Visual Studio 코드: 컴파일 형식 스크립트 모듈 (0) | 2023.07.19 |
날짜 시간을 동부 시간으로 변환하는 방법 (0) | 2023.07.19 |
Oracle에서 CTE 생성 (0) | 2023.07.19 |