Django 그룹과 권한은 어떻게 사용하나요?


답변:


121

첫 번째 질문은 어떤 권한이 필요하고 어떤 종류의 권한이 필요한지입니다. 어떤 종류로든 모델 수준 또는 개체 수준을 원하십니까? 차이점을 명확히하기 위해 자동차 모델이 있다고 가정합니다. 모든 차량에 대한 권한을 부여하려면 모델 수준이 적합하지만 차량별로 권한을 부여하려면 객체 수준이 필요합니다. 둘 다 필요할 수 있으며 앞으로 보게 될 문제는 아닙니다.

모델 권한의 경우 Django가 이러한 작업을 처리합니다. 각 모델에 대해 Django는 'appname.permissionname_modelname'형식으로 권한을 생성합니다. Car 모델에 'drivers'라는 앱이있는 경우 하나의 권한은 'drivers.delete_car'입니다. Django가 자동으로 생성하는 권한은 생성, 변경 및 삭제입니다. 이상한 이유로 CRUD의 읽기 권한을 포함하지 않기로 결정한 경우 직접 수행해야합니다. Django는 어떤 이유로 CRUD의 '업데이트'를 '변경'으로 변경하기로 결정했습니다. 모델에 더 많은 권한을 추가하려면 (예 : 읽기 권한) Meta 클래스를 사용합니다.

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

권한은 튜플 집합이며, 튜플 항목은 위에서 설명한 권한과 해당 권한에 대한 설명입니다. permname_modelname 규칙을 따를 필요는 없지만 저는 보통 그것을 고수합니다.

마지막으로 권한을 확인하려면 has_perm을 사용할 수 있습니다.

obj.has_perm( 'drivers.read_car' )

여기서 obj는 사용자 또는 그룹 인스턴스입니다. 이것에 대한 함수를 작성하는 것이 더 간단하다고 생각합니다.

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

엔티티는 (그룹 또는 사용자)에 대한 권한을 확인할 개체이고, 모델은 모델의 인스턴스이고, perms는 확인할 문자열 (예 : [ 'read', 'change'])의 권한 목록이고, app은 문자열로 된 애플리케이션 이름. 위의 has_perm과 동일한 검사를 수행하려면 다음과 같이 호출합니다.

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

객체 또는 행 권한을 사용해야하는 경우 (동일한 의미 임) Django는 그 자체로 도움을 줄 수 없습니다. 좋은 점은 모델 및 개체 권한을 나란히 사용할 수 있다는 것입니다. 객체 권한을 원한다면 직접 작성하거나 ( 1.2 이상을 사용하는 경우) 다른 사람이 작성한 프로젝트를 찾아야합니다. 제가 좋아하는 것은 washingtontimes의 django-objectpermissions 입니다.


27
이것은 권한에 대한 훌륭한 대답이지만 그룹과 Django에서 작동하는 방식에 거의 영향을 미치지 않습니까?
NotSimon jul.

4
그룹에는 많은 것이 없으며 Linux 사용자 그룹과 마찬가지로 권한을 적용하기 위해 사용자를 함께 묶기위한 것입니다. 그룹에 권한을 부여하면 해당 그룹의 모든 구성원에게 적용됩니다. 문서에는 모든 것이 실제로 나와 있습니다 : docs.djangoproject.com/en/dev/topics/auth/default/#groups .
Alex Kuhl 2013

1
장고 가디언 을 사용하는 것을 고려하고 싶다는 점을 여기서 지적해야 합니다. 여기 에서 승인 패키지 내역을 참조 하세요. 또한이 SOF 링크 는 좋은 비교를 제공합니다.
Jeff Sheffield

1
이 문제를 발견하고 개체 권한이 필요했을 때 django-guardian : django-guardian.readthedocs.org/en/v1.2
dArignac 2014

1
'직접 작성'이 다운되었습니다. 또는 뭔가. 지금은 중국어입니다.
William Karlsson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.