2010-06-02 2 views
1

기존 응용 프로그램에 대해 ACL을 구현해야합니다.
사용자, 그룹그룹 멤버 테이블을 데이터베이스에 추가했습니다.
사용자그룹 사이의 연관성 테이블 그룹 멤버을 통해 ManyToMany 관계를 정의했습니다. 앱 (i..e 항목)의 일부 능숙를 보호하기 위해
제가 추가적인 관련 테이블에 추가 군간 ManyToMany 관계를 연관 테이블 표기 auth_items/사용자 및 특정 항목.SQLAlchemy 및 복합 쿼리

항목은 다음과 같은 열이

  • USER_ID -> 사용자 테이블
  • GROUP_ID -> 그룹 테이블
  • ITEM_ID -> 항목 테이블

적어도 을의에 user_idgroup_id 열이 설정됩니다. 따라서 특정 항목에 대한 그룹 또는 사용자의 액세스를 정의 할 수 있습니다.

사용자/그룹과 항목 간의 관계를 정의하기 위해 AssociationProxy를 사용했습니다.

이제 사용자가 액세스 할 수있는 모든 항목을 표시하고 싶습니다. 정말 힘들었습니다. 다음과 같은 기준이 사용됩니다

  • 사용자가 소유하는 모든 항목이 모두 공개 항목이 표시되어야
  • (item.owner_id = user.id) 표시한다 (item.access = 공공)
  • 사용자가 액세스 할 수있는 모든 항목이 표시되어야합니다 (auth_item.user_id = user.id)
  • 사용자 그룹이 액세스 할 수있는 모든 항목이 표시되어야합니다.

첫 번째 3 가지 기준은 매우 간단하지만 4 번째를 수행하는 데 어려움이 있습니다.

clause = and_(item.access == 'public') 
if user is not None: 
    clause = or_(clause,item.owner == user,item.users.contains(user),item.groups.contains(group for group in user.groups)) 

세 번째 기준은 오류가 발생합니다 :

여기 내 접근 방식입니다.

item.groups.contains(group for group in user.groups) 

실제로 이것이 좋은 접근 방법인지는 잘 모르겠습니다.
manytomany 관계를 필터링 할 때 가장 좋은 방법은 무엇입니까?
다른 목록/관계를 기반으로 manytomany 관계를 필터링하는 방법은 무엇입니까?


는 Btw은 내가 최신 SQLAlchemy의 (6.0)과 불로 불사의 영약 버전 어떤 통찰력

감사를 사용하고 있습니다.

답변

1

방법은 단일 품목 점검 용입니다. 그룹 테이블이 Group 클래스로 매핑되었다고 가정하면 다음을 시도해보십시오.

item.groups.any(Group.id.in_([group.id for group in user.groups]) 
+0

제안 해 주셔서 감사합니다. 나는 내일 그것을 시도 할 것이고, 나의 발견과 함께 뒤로보고 할 것이다. –