>  기사  >  백엔드 개발  >  Django 사용자 인증 시스템(3) 그룹 및 권한

Django 사용자 인증 시스템(3) 그룹 및 권한

黄舟
黄舟원래의
2016-12-23 17:42:551327검색

Django의 권한 시스템은 매우 간단합니다. 사용자나 그룹의 사용자에게 권한을 부여할 수 있습니다.

Django 관리 백엔드는 이 권한 시스템을 사용하지만, 자신의 코드에서도 사용할 수 있습니다.

사용자 개체에는 두 개의 ManyToManyField 필드, 그룹 및 user_permissions가 있습니다.

groups = models.ManyToManyField(Group, verbose_name=_('groups'),
공백=True, help_text=_ ( '이 사용자가 속한 그룹은 '
                                                                                               >                         name="user_set", 관련_query_name="user")
user_permissions = models.ManyToManyField(Permission,
verbose_name=_('사용자 권한') , 공백=True,
help_text=_('이 사용자에 대한 특정 권한.'),
관련_name= "user_set", 관련_query_name="user")


액세스할 수 있습니다. 다른 django 모델처럼:

myuser.groups = [group_list]

myuser.groups.add(group, group, ...)

myuser.groups.remove(group, group, .. .)
myuser.groups.clear()
myuser.user_permissions = [permission_list]
myuser.user_permissions.add(permission, 허가, ...)
myuser.user_permissions.remove(permission, 권한, ...)
myuser.user_permissions.clear()


권한

권한은 모델로 존재합니다. 권한을 설정하려면 권한 인스턴스를 생성해야 합니다. 모델.

@python_2_unicode_ Compatible

class Permission(models.Model):

"""
권한 시스템은 특정
사용자 및 사용자 그룹에 권한을 할당하는 방법을 제공합니다.

권한 시스템은 Django 관리 사이트에서 사용되지만
자신의 코드에서도 유용할 수 있습니다. Django 관리 사이트는 다음과 같이 권한을 사용합니다.

- "추가" 권한 제한 "추가" 양식을 보고
          개체를 추가할 수 있는 사용자의 기능.
- "삭제" 권한은 개체 삭제 기능을 제한합니다.

권한은 개체 유형별로 전역적으로 설정됩니다. , 특정 개체
인스턴스별로는 아니지만 "Mary는 뉴스 기사를 변경할 수 있습니다"라고 말할 수는 있지만
현재는 "Mary가 뉴스 기사를 변경할 수 있지만
자신이 만든 뉴스만 변경할 수 있습니다. " 또는 "Mary는
특정 상태나 게시 날짜가 있는 뉴스 기사만 변경할 수 있습니다."

추가, 변경, 삭제라는 세 가지 기본 권한이 각 Django 모델에 자동으로
생성됩니다. .
"""
name = models.CharField(_( 'name'), max_length=255)
content_type = models.ForeignKey(ContentType)
codename = models.CharField(_(' codename'), max_length=100)
object = PermissionManager()

class Meta:
verbose_name = _('permission')
verbose_name_plural = _('permissions')
Unique_together = (('content_type', 'codename'),)
주문 = ('content_type__app_label', 'content_type__model',
                                           > Self.Content_type),
Six.text_type (Self.Name))

DEF Natural_key (Self):
Return ( self.codename,) + self.content_type.natural_key()
natural_key.dependent = ['contenttypes.contenttype']


필드 필드

이름: 필수입니다. 50자 이하(예: '투표 가능')

content_type: 필수, 애플리케이션의 각 모델에 대한 레코드가 포함된 django_content_type 데이터베이스 테이블에 대한 참조입니다.

코드명: 필수, 100자 이하(예: 'can_vote')

모델에 대한 권한을 생성하려는 경우:

from django.db import models

class Vote(models.Model):
...

클래스 메타:
권한 = (("can_vote", "Can Vote"),)

이 모델이 애플리케이션 foo에 있는 경우 권한은 'foo. can_vote' , 사용자에게 권한이 있는지 확인 myuser.has_perm('foo.can_vote')

기본 권한 기본 권한

django.contrib.auth가 INSTALLED_APPS에 구성된 경우 설치된 애플리케이션의 각 Django 모델은 추가, 변경, 삭제라는 3가지 기본 권한을 생성합니다.

이 권한은 처음으로manage.py 마이그레이션을 실행할 때 생성됩니다(syncdb 1.7 이전). 이때 모든 모델에는 권한이 설정됩니다. 이후에 생성된 새 모델은 Manage.py 마이그레이션이 다시 실행될 때 생성되는 기본 권한을 갖게 됩니다. 이러한 권한은 관리자 관리 인터페이스의 생성, 삭제 및 수정 동작에 해당합니다.

모델 Bar가 포함된 foo 애플리케이션이 있다고 가정하면 다음 방법을 사용하여 기본 권한을 테스트할 수 있습니다.

add: user.has_perm('foo.add_bar')
change : user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')
권한 모델은 일반적으로 직접 사용되지 않습니다.

그룹

그룹은 모델로도 존재합니다:

@python_2_unicode_ Compatible
class Group(models.Model):
"""
그룹은 다음과 같습니다. 사용자를 분류하여 해당 사용자에게 권한을 적용하거나
다른 라벨을 적용하는 일반적인 방법입니다. 사용자는 원하는 수의
그룹에 속할 수 있습니다.

그룹에 속한 사용자는 자동으로 모든 권한을 갖습니다. 해당
그룹에 권한이 부여됩니다. 예를 들어 사이트 편집자 그룹에
can_edit_home_page 권한이 있는 경우 해당 그룹의 모든 사용자는 해당 권한을 갖게 됩니다.

권한 외에도 그룹은 다음을 수행하는 편리한 방법입니다. 사용자를 분류하여
일부 레이블 또는 확장 기능을 적용합니다. 예를 들어
'특수 사용자' 그룹을 만들고 해당 사용자에게 특별한 작업을 수행하는 코드를 작성할 수 있습니다.
- 사이트의
회원 전용 부분에 대한 액세스 권한을 부여하거나 회원 전용 이메일
메시지를 보내는 등의 방법이 있습니다.
"""
name = models.CharField(_(' name '), max_length=80, Unique=True)
권한 = models.ManyToManyField(Permission,
verbose_name=_('permissions'), 공백=True)

개체 = GroupManager()

클래스 메타:
verbose_name = _('group')
verbose_name_plural = _('groups')

def __str__(self):
return self.name

def natural_key(self):
return (self.name,)

fields:

name: 필수, 80자 이하, 예: '멋진 사용자'.

permissions:ManyToManyField to Permission

group.permissions = [permission_list]
group.permissions.add(permission, 허가, ...)
group.permissions.remove( 허가, 허가, ...)
group.permissions.clear()

프로그래밍 방식으로 권한 생성

모델 메타를 사용하여 권한을 생성하는 것 외에도 다음을 사용할 수도 있습니다. 코드를 직접 생성합니다.

예를 들어 myapp 애플리케이션에서 BlogPost 모델에 대한 can_publish 권한을 생성합니다.

from myapp.models import BlogPost
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(codename='can_publish',
                     name= '게시물 게시 가능',
Content_type = Content_type)

권한은 user_permissions를 통해 사용자 개체에 부여되거나 권한 속성을 통해 그룹에 부여될 수 있습니다.

권한 캐싱

사용자의 권한을 확인하면 캐시할 수 있습니다. 사용자에게 새로운 권한을 부여한 경우 즉시 확인하면 확인되지 않습니다. 가장 쉬운 방법은 사용자 개체를 다시 가져오는 것입니다.

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):
user = get_object_or_404(User, pk=user_id )
#권한 확인은 현재 권한 집합을 캐시합니다
user.has_perm('myapp.change_bar')

허가 = Permission.objects.get(codename='change_bar')
user .user_permissions.add(permission)

# 권한 캐시 세트 확인
user.has_perm('myapp.change_bar') # False

# 새 인스턴스 요청
user = get_object_or_404( User, pk=user_id)

# 권한 캐시가 데이터베이스에서 다시 채워집니다
user.has_perm('myapp.change_bar') # True

...

권한 데코레이터

permission_required(perm[, login_url=None, raise_Exception=False])

사용자에게 @login_required()와 유사한 특정 권한이 있는지 확인

from django.contrib.auth.designators importPermission_required

@permission_required('polls.can_vote', login_url='/loginpage/')
def my_view(request):

템플릿의 권한

사용자의 권한은 django.contrib.auth.context_processors.PermWrapper의 인스턴스인 템플릿 변수 {{ perms }}에 저장됩니다.

{{ perms.foo }}

위의 단일 속성은 User.has_module_perms의 프록시입니다. 사용자가 foo에 권한이 있으면 True

{{ perms.foo.can_vote }}

위의 2단계 속성 쿼리는 User.has_perm의 프록시입니다. 사용자에게 foo.can_vote 권한이 있으면 참입니다.

예:

{% if perms.foo %}

foo 앱에서 작업을 수행할 수 있는 권한이 있습니다.


{ % if perms.foo.can_vote %}
            

투표하실 수 있습니다!


                                                                                p>운전하실 수 있습니다!


{% endif %}
{% else %}

foo 앱에서 어떤 작업도 할 수 있는 권한이 없습니다.< /p>
{% endif %}


또는:

{% if 'foo' in perms %}

{% if 'foo.can_vote' in perms %}

                                             ~      . 더 많은 관련 내용을 보시려면 PHP 중국어 웹사이트(www. .php.cn)!



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.