2009-12-03 2 views
1

단일 계정 모델을 가진 장고 앱이 있습니다. 이를 다중 계정으로 변환하므로 거의 모든 모델에 ForeignKey(Account)이 있습니다.Django에서 계정 기반 분리를 시행하는 방법

Account (각 계정이 자체 하위 도메인에 있음)이 자신의 데이터에만 액세스 할 수있는 가장 쉬운 방법은 무엇입니까? 하위 도메인을 채우는 미들웨어와 각 요청의 현재 계정이 있습니다.

모든보기에 filter(...., account = request.account)을 추가하면 어렵게 해결할 수 있습니다. 이

  1. filter(...., account = request.account)

    만들고, 모든 쿼리에 추가됩니다으로 바람직하지 않다이 아닌 건조, repetative 오류가 발생하기 쉽습니다.
  2. 큰 위험은 누락 된 필터가있는 경우 보안 위험이있는 곳이면 어디든 있습니다.

답변

2

확실한 승자가 없다고 생각합니다. 특히 모든 검색어를 계정별로 필터링해야하는 것은 아닙니다. 또한 오래된 threadlocals 트릭이 필터 매개 변수의 자동 삽입을 수행하는 유일한 방법은 추측 할 수있는 미들웨어가 될 것이라고 믿는 신뢰할 수없는 것으로 간주됩니다 ...하지만 또한 나에게 신뢰할 수없는 복잡한 것 같습니다.

여기에서도 도움이 될 수있는 쿼리 관리자를 만드는 좋은 방법을 찾지 못했지만 가능할 수도 있습니다.

"멀티 테넌트"데이터베이스를위한 최상의 솔루션은 모든 쿼리가 계정별로 필터링되는지 확인하는 것입니다. 당신은이 작업을 수행 할 수 있습니다 :

  • 디버그 모드 미들웨어 당신의 테스트에서 Middleware: Record ownership screener

  • 어떤 시험에 의해 생성 된 SQL을 확인하고 계정 필드가 쿼리에 확인 등.또한 테스트 결과 테스트에서 테스트 결과가 나타나지 않도록 "기타 계정"데이터를 테스트 픽스처에 포함 할 수 있습니다.

  • 모든 쿼리가

확실히 꽤되지 코드 검토 중에 필터 점검하지만, 가장 내가 지금까지 할 수 있었던했는지 만들기.

0

This 스 니펫으로 올바른 방향을 제시 할 수 있습니다. 나는 행 레벨 권한이 1.2에 대한 todo 목록에도 있다고 생각하지만 100 % 확실하지는 않습니다.

0

세션 계정을 쿼리에 자동으로 삽입하고 다른 모든 매개 변수를 인수로 사용하는 함수를 작성할 수없는 이유가 있습니까?

+2

어떻게 명시 적으로 각 쿼리를 통과하지 않고'모델 또는 관리자의 request.session'을 얻을 것입니다. 내가 그렇게하면, 각 호출에 대해 단지 '필터링'할 수 있습니다. – agiliq

0

django.contrib.auth을 사용하고 있습니까? 당신이 경우

, 단지 ForeignKey(User, unique=true) 계정 만들기 및 사용자

즉, 모든 모델을 가리 킵니다. ForeignKey(User) 또한

django Auth Docs

편집에서보세요 : 내가 생각 내가 지금 조금 더 나은 귀하의 우려를 이해 ...

을 대신

my_model.objects.filter(user=request.user) 

단지 할 일을 :

request.user.my_model_set.all() 
+2

예, 그렇긴하지만 모든 곳에 명시적인 '필터'를 넣어야합니다. – agiliq

+0

하지만 사용자 객체 인'object1.objects.filter (user = user)'대신'user.object1_set.all()'에서 시작할 수 있습니다. – Jiaaro

관련 문제