기존 응용 프로그램에 대해 ACL을 구현해야합니다.
사용자, 그룹 및 그룹 멤버 테이블을 데이터베이스에 추가했습니다.
사용자과 그룹 사이의 연관성 테이블 그룹 멤버을 통해 ManyToMany 관계를 정의했습니다. 앱 (i..e 항목)의 일부 능숙를 보호하기 위해
제가 추가적인 관련 테이블에 추가 군간 ManyToMany 관계를 연관 테이블 표기 auth_items/사용자 및 특정 항목.SQLAlchemy 및 복합 쿼리
항목은 다음과 같은 열이
- USER_ID -> 사용자 테이블
- GROUP_ID -> 그룹 테이블
- ITEM_ID -> 항목 테이블
적어도 을의에 user_id 및 group_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)과 불로 불사의 영약 버전 어떤 통찰력
감사를 사용하고 있습니다.
제안 해 주셔서 감사합니다. 나는 내일 그것을 시도 할 것이고, 나의 발견과 함께 뒤로보고 할 것이다. –