Django에 내장된 권한 제어4 - 라이센스(Permission) 및 사용자 그룹(Group)

6612 단어 Permission
Django의 라이센스(Permissions) 및 사용자 그룹(Group)
이어 위의 3편의 토론문에서 우리는 Django에서 Authentication 시스템을 어떻게 사용하는지 설명했고 사용자의 창설, 로그인, 로그인, 로그인, 로그인을 통해 사용자의 인증을 완성했다.다음은 Authorization 권한 수여라는 또 다른 의제를 살펴보겠습니다.Django에서 이 부분은 Permission을 사용하여 간단하게 완성했습니다.이 글에서 우리는 Permission에 대해 연구를 진행해야 한다.
Django의 Permissions 설정은 주로 Django가 자체로 사용하는 Admin 인터페이스를 통해 유지보수됩니다.주로 특정 사용자가 특정한 모델에 대응하는dd\change\delete 세 가지 종류의 권한을 설정합니다. 즉, 특정한 사용자가 특정한 모델에 대해 증가, 수정, 삭제할 수 있는 권한을 설정하는 것입니다.
Permission은 특정 모델을 설정할 수 있을 뿐만 아니라 한 모델의 특정한 대상에 대해서도 설정할 수 있다. 
라이센스(Permissions)
사실, 우리가django에auth 앱을 설치한 후에Django는 당신이 설치한 모든 앱의 모델에 세 가지 권한을 생성한다.add,change,delete;상응하는 데이터는python 관리자를 실행하는 것입니다.py syncdb 이후 데이터베이스에 삽입됩니다.매번 syncdb를 실행할 때마다, Django는 모든 사용자에게 새로 나온 모델에게 이 세 가지 권한을 추가합니다.
예를 들어 school이라는 응용 프로그램을 만들었는데 그 안에 Study Group이라는 모델이 있는데, 그 결과는 True로 되돌아갈 수 있습니다.
user.hash_perm('school.add_studygroup')

user.hash_perm('school.change_studygroup')

user.hash_perm('school.delete_studygroup')


물론 우리도 스스로 허가를 정의할 수 있다.방법은 간단하다. 모델류의 메타 속성에permissions 정의를 추가하는 것이다.예를 들어 모델 클래스를 만들었는데 디스커션이라고 한다. 우리는 이 모델의 권한 허가를 제어할 수 있는 몇 가지 권한을 만들 수 있다. 어떤 사람들이 토론을 하고 회답을 하며 토론을 닫을 수 있도록 제어할 수 있다.
class Discussion(models.Model):

    ...

    class Meta:

        permissions = (

            ("open_discussion", "Can create a discussion"),

            ("reply_discussion", "Can reply discussion"),

            ("close_discussion", "Can remove a discussion by setting its status as closed"),

        )


다음에 해야 할 일은 마지막 단계, 실행 관리자입니다.py syncdb, 이렇게 데이터베이스에 이 세 개의 허가가 생겼습니다.
두 가지 방법으로 위의 권한을 사용자에게 부여할 수 있습니다.
4
  • 어떤user의user를 통해permissions 속성(기사 1에서 언급됨):
    user.user_permissions.add(permission, permission, ...)
    
    

      

  • 4
  • user의 한 그룹을 통과한 다음 그룹의permissions 속성을 통과합니다.
    group.permissions.add(permission, permission, ...)
    
    

      

  • 예를 들어 우리는 한 사용자가 토론을 할 권한이 있는지 판단하려면 아래의 코드를 사용할 수 있다.
    user.has_perm('school.open_discussion')  

    Permission 클래스와 User 클래스는 특별한 것이 없고 모두 일반적인 Django 모델입니다.첫 번째 문장에서 우리는 User 모델의 속성과 방법을 상세하게 탐구했다.여기서 Permission 모델과 미리 정의한 다음syncdb 방식으로permission을 만드는 것이 아니라 프로그래밍 방식을 어떻게 사용하는지 연구해 봅시다.어쩌면 동적 창설과 권한 분배가 필요할 수도 있기 때문이다.
    Permission 속성:
    소속 모듈:django.contrib.auth.models
    속성:
    4
  • name: 필수 항목입니다.50자 미만입니다.예를 들면'Can publish'입니다
  • content_type: 필수 항목입니다.하나는 Django 를 가리킨다content_type 데이터베이스 테이블은 모든 Django 모델에 대해 이 테이블 안에 기록이 대응되어 있습니다

  • 4
  • codename: 필수 항목입니다.100자 미만입니다.예:'can 'publish'.

  • 방법:특별한 방법이 없다.모든 일반 DjangoModel 방법이 있습니다.
    프로그래밍 작성 권한:
    from django.contrib.auth.models import Group, Permission
    
    from django.contrib.contenttypes.models import ContentType
    
    
    
    content_type = ContentType.objects.get(app_label='school', model='Discussion')
    
    permission = Permission.objects.create(codename='can_publish',
    
                                           name='Can Publish Discussions',
    
                                           content_type=content_type)
    
    

    인터페이스에서 라이센스 사용
    다음은 Template(템플릿)에서 라이센스를 사용하는 방법에 대해 살펴보겠습니다.어떤 때는 인터페이스에서 일부 허가를 통해 인터페이스의 디스플레이를 제어해야 하기 때문이다.
    Django에서 인터페이스에서 권한 설정을 하는 것은 매우 편리합니다. 왜냐하면 Django가 당신을 위해 많은 일을 했기 때문입니다.
    템플릿 코드에는 두 가지 속성이 있습니다. Django가 제공하는 것입니다. 하나는 user이고, 하나는perms입니다.
    예를 들어 우리는 한 사용자가 로그인한 사용자인지 아닌지를 이렇게 판단하여 서로 다른 디스플레이를 할 수 있다.
    {% if user.is_authenticated %}
    
        <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
    
    {% else %}
    
        <p>Welcome, new user. Please log in.</p>
    
    {% endif %}
    
    

    사용자 변수는 User 또는 AnoymousUser 객체입니다.
    perms 변수는django입니다.contrib.auth.context_processors.PermWrapper 객체, 현재 사용자에 대한 User.has_module_perms 및 User.has_perm가 봉인되었습니다.이 포장기는perm를 사용하기에 매우 편리하다.예를 들어 현재 사용자가 school 응용 프로그램의 모든 권한을 가지고 있는지 판단해야 한다.
    {{perms.school}}
    현재 사용자가 school 응용 프로그램에서 토론을 발표할 권한이 있는지 판단하려면 {{{perms.school.publish discussion}}
    이렇게 하면template의if 태그와 결합하여 우리는 현재 사용자가 가지고 있는 권한을 판단하여 서로 다른 인터페이스를 표시할 수 있다.
    {% if perms.school %}
    
        <p>You have permission to do something in the school app.</p>
    
        {% if perms.school.publish_discussion %}
    
            <p>You can discussion!</p>
    
        {% endif %}
    
        {% if perms.school.reply_discussion %}
    
            <p>You can reply discussion!</p>
    
        {% endif %}
    
    {% else %}
    
        <p>You don't have permission to do anything in the school app.</p>
    
    {% endif %}
    
    

    물론 모델에는 왜 이 두 변수가 있는지 물어볼 수밖에 없다.꽁고는 어떻게 했을까요?정답: settings의 TEMPLATECONTEXT_PROCESSORS에 정의된django.contrib.auth.context_processors.auth 프로세서.Django가 Template 해석에 들어가기 전에 이 하나의context 를 통과해야 합니다processor.그중에서django.contrib.auth.context_processors.auth는 user와perms라는 두 대상을 Template Context에 넣는 것이다

    또한 TemplateContext로 RequestContext를 사용해야 합니다.예를 들면 다음과 같습니다.
    from django.template import RequestContext
    
    from django.shortcuts import render_to_response
    
    def someview(request):
    
        ...view logic
    
        ctx = {somekey:somevalue}
    
        return render_to_response('instances/accounts/tparts/update_share_limit_form.html',
    
                                                  ctx,
    
                                                  context_instance=RequestContext(request))
    
    

      
    상술한 두 가지 요점을 확보하면, 우리가template에서 권한 제어를 사용하는 것은 매우 간단하다.
    다음은 마지막 핵심 모델인 사용자 그룹에 대해 간단하게 말씀드리겠습니다.
    사용자 그룹(Group)
    사용자 그룹 모델은 간단합니다. User 모델과 다중 관계식입니다.사용자 그룹은 말 그대로 사용자를 그룹화한 것이다.그 역할은 권한 제어에서 사용자의 허가를 대량으로 분배할 수 있고 하나하나 사용자에 따라 분배하지 않아도 유지 보수의 작업량을 절약할 수 있다.
    한 사용자를 그룹에 가입하면 해당 사용자는 해당 그룹에 할당된 모든 라이센스를 갖게 됩니다.예를 들어 팀 티처스가 허가 cancreate_lesson.그럼 팀워크스에 속하는 모든 사용자에게 이 권한이 있습니다.
    Group:
    속성:
    name: 필요합니다.80자 미만
    4
  • permissions: 다중 참조.및 user의 userpermissions 속성 유형이 같습니다.다음과 같은 이점을 얻을 수 있습니다.
    group.permissions = [permission_list]
    
    group.permissions.add(permission, permission, ...)
    
    group.permissions.remove(permission, permission, ...)
    
    group.permissions.clear()
    
    

    이 그룹에 권한을 부여합니다

  • 다음 블로그에서 우리는 Django가 내장한 권한 제어 시스템의 핵심 부품인backend를 토론하여 Django가 내장한 권한 제어를 토론하는 마지막 편으로 삼을 것이다.
     

    좋은 웹페이지 즐겨찾기