Django 인증 시스템

이 블로그는 Django 인증 시스템인 Django 인증을 사용하여 인증(authentiaction)과 권한 수여(authorization) 두 가지 기능을 제공했다. 이 두 가지 기능은 어느 정도에 서로 관련이 있기 때문이다.그래서 Django의 인증은 보통 인증 시스템으로 사용된다.
User 객체
User 객체는 인증 시스템의 핵심 부분입니다.이것은 일반적으로 사이트와 상호작용하는 사용자를 표시하고 User 대상은 권한 제어, 사용자 등록, 관련 내용 창설자 등 기능에도 사용된다.Django의 인증 시스템에서 한 가지 유형의 사용자만 있다. 즉,'슈퍼유저스'와 관리자'staff'사용자는 특정한 속성 집합을 가진 사용자이지 서로 다른 유형의 User 대상이 아니다.
기본 User 객체에는 다음과 같은 기본 필드가 있습니다.
  • username
  • password
  • email
  • first_name
  • last_name

  • 자세한 API는 특정 작업에 편향된 전체 API 문서, 다음 문서를 참조하십시오.
    사용자 만들기(users)
    users를 만드는 가장 직접적인 방법은create사용자 () 이 보조 함수입니다.
    from django.contrib.auth.models import User
    user = User.object.create_user('john', '[email protected]', 'password')
    #    ,user    User            。
    #            。
    #     user last_name
    user.last_name = 'Lennon'
    user.save()

    setting 파일의 INSTALLAPP에 admin이 설정되어 있어 당신도 admin을 통해 상호작용적으로 사용자를 관리할 수 있습니다
    수퍼유저 만들기
    createsuperuser를 사용하여 슈퍼 사용자를 만듭니다: $ python manage.py createsuperuser --username=joe [email protected]그리고 이 명령은 비밀번호를 입력하라는 것을 알려 줍니다. 비밀번호를 입력하면 사용자가 바로 만들어집니다. -username과 -email 파라미터를 입력하는 것을 잊어버리면 이 명령을 입력하라는 것을 알려 줍니다.
    암호 수정
    Django는user모델에 암호를 저장하는 명문이 아니라 해시 값입니다. (자세한 내용은 문서 참조: Django가 암호를 어떻게 처리하는지 보십시오.) 따라서 사용자 대상의password 속성을 직접 조작하지 마십시오.이것도 저희가 create 를 사용해서...사용자 () 이 보조 함수로 사용자를 만드는 이유입니다.
    사용자의 암호를 수정하려면 다음과 같은 몇 가지 선택이 있습니다.명령manage.py changepassword *username*을 사용하여 명령줄에서 User 암호를 수정하는 방법을 제공합니다.이것은 사용자에 대한 비밀번호를 수정하라고 알려 줍니다. 비밀번호를 두 번 입력해야 합니다.만약 입력한 두 번의 비밀번호가 같다면, 사용자에 대한 비밀번호는 즉시 새로운 비밀번호로 수정될 것입니다.사용자를 제공하지 않으면 명령은 현재 시스템 사용자와 같은 이름의user 비밀번호를 수정하려고 시도합니다.2. set 사용password () 방법
    >>> from django.contrib.auth.models import User
    >>> u = User.object.get(username='john')
    >>> u.set_password('new password')
    >>> u.save()

    마찬가지로 만약에 admin이 설치되어 있다면 당신도 admin의 인증 시스템 페이지에서 사용자의 비밀번호를 수정할 수 있습니다.
    SessionAuthentication Middleware를 사용하면 비밀번호를 수정하면 사용자의 모든 세션이 무효화됩니다
    인증 사용자
    authenticate(**credentials)
    주어진 사용자 이름 (username) 과 비밀번호 (password) 를 인증하려면 authenticate () 방법을 사용하십시오.이 함수는 키워드 매개 변수 형식으로 인증을 받습니다. 기본적으로 설정된 키워드는username과password입니다.암호가 사용자 이름과 일치하면 함수는 User 객체를 반환하고 그렇지 않으면 None을 반환합니다. 예를 들어 다음과 같습니다.
    from django.contrib.auth import authenticate
    user = authenticate(username='john',password='secret'
    if user is not None:
        #       
        if user.is_active:
            print("User is valid, active and authenticated")
        else:
            print("The password is valid, but the account has been disabled!")
    else:
        print("The username and password were incorrect.")

    is 정보active 속성, 자세한 내용은 위의 전체 API 설명서를 참조하십시오.
    권한 및 권한 부여
    Django는 특정한 사용자와 사용자 그룹에 서로 다른 권한을 분배하는 간단한 권한 시스템을 가지고 있다.Django의 admin 사이트에서 사용됩니다.자신의 코드에서 이 권한 시스템을 사용하는 것도 환영합니다.Django의 admin에서 다음과 같은 권한을 사용합니다.
  • 어떤 대상의 유형에'추가(add)'권한을 가진 사용자는'add'폼에 접근할 수 있고 이 유형의 대상을 추가할 수 있습니다. (예를 들어 어떤 사용자가 Brand 이 유형에 대한dd 권한을 가지고 있어야 이 사용자는 add 폼에 접근하고 Brand의 대상을 추가할 수 있습니다.)
  • 어떤 대상의 유형에 대해'수정(change)'권한을 가진 사용자는 수정 목록을 보거나'change)'폼을 보거나 대상을 수정할 수 있습니다.
  • 특정 대상의 유형에 대해'삭제(delete)'권한을 가진 사용자는 대상을 삭제할 수 있습니다.

  • 뿐만 아니라 유형마다 다른 권한을 설정할 수 있을 뿐만 아니라 특정한 대상에 대해서도 다른 권한을 설정할 수 있다.통일된 유형의 서로 다른 대상에 서로 다른 권한을 설정하기 위해 모델Admin 클래스가 제공하는 방법:hasadd_permision() has_change_permission() has_delete_permission()
    User의 객체에는 그룹 및 user 라는 두 개의 필드가 있습니다.permissions, 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, permission, ...)
    myuser.user_permissions.remove(permission, permission, ...)
    myuser.user_permissions.clear()

    기본 사용 권한
    Django 구성 파일의 INSTALLEDAPP에 django. 추가contrib.auth 시, Django는 모든 설치 응용 프로그램에 정의된 Django 모델에 기본 권한을 생성합니다. add,change, delete
    INSTALLED로...APP에 django. 추가contrib.auth의 첫 번째 마이그레이션(migrate)에서 Django는 INSTALLEDAPP의 모든 응용 프로그램 정의 모델은 기본 사용 권한을 만듭니다.다음에 추가된 응용 프로그램에서 관리자를 실행합니다.py migrate 시 Django는 새로 추가된 응용 프로그램에 대한 기본 권한을 만듭니다.
    앱이 하나 있다면lable은 foo의 응용 프로그램과 Bar라는 모델로 다음 코드로 사용할 수 있는 기본 권한을 테스트합니다.
  • add: user.has_perm(‘foo.add_bar’)
  • change:user.has_perm(‘foo.change_bar’)
  • delete: user.has_perm(‘foo.delete_bar’)

  • 사용자 그룹(Group)
    django.contrib.auth.models.그룹 모델은 사용자 분류의 일반적인 방식이다. 이런 방식을 통해 사용자에게 서로 다른 권한을 부여하거나 탭을 설정할 수 있다.한 사용자가 여러 사용자 그룹에 속할 수 있음
    사용자 그룹의 사용자는 이 사용자 그룹에 부여된 권한을 가지고 있습니다.예를 들어, 사용자 그룹 Site editors가 can 을 소유하고 있습니다.edir_home_페이지의 권한입니다. 이 사용자 그룹의 모든 사용자가 이 권한을 가지고 있습니다.
    권한 이외에 사용자 그룹은 분류 사용자에게 라벨을 나누어 기능을 추가하는 간편한 방법이다.예를 들어, 'Special users' 라는 사용자 그룹을 만들 수 있으며, 개편 중인 사용자만 회원의 페이지에 접근할 수 있습니다.
    코드 방법으로 사용자 권한 만들기
    모델의 원류에서 사용자 정의 권한을 정의하지만, 직접 권한을 만들 수도 있습니다.예를 들어 myapp의 BlogPost 응용 프로그램에 can 을 만들 수 있습니다publish 권한:
    from myapp.models import BlogPost
    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType
    
    content_type = ContentType.objects.get_for_model(BlogPost)
    permission = Permission.objects.create(
        codename='can_publish',
        name='Can Publish Posts',
        content_type=content_type,
    )

    그리고 이 권한은user의user 를 통해permissions 속성은 사용자에게 분배되고 그룹의 permission 속성을 통해 사용자 그룹을 분배할 수 있습니다.
    권한의 캐시
    ModelBackend는 처음 User 객체에 액세스할 수 있는 권한이 필요할 때 해당 권한을 캐시합니다.새로 추가된 권한에 대해 즉시 검사하지 않기 때문에, 이러한 방법은 Request-response 순환에 매우 유리하다. (예를 들어admin에서)새로운 권한을 추가한 후 바로 테스트나 보기에서 그들을 검사하려면 데이터베이스에서 User:
    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)
        # any permission check will cache the current set of permissions
        user.has_perm('myapp.change_bar')
    
        permission = Permission.objects.get(codename='change_bar')
        user.user_permissions.add(permission)
    
        # Checking the cached permission set
        user.has_perm('myapp.change_bar')  # False
    
        # Request new instance of User
        # Be aware that user.refresh_from_db() won't clear the cache.
        user = get_object_or_404(User, pk=user_id)
    
        # Permission cache is repopulated from the database
        user.has_perm('myapp.change_bar')  # True

    웹 요청에서의 인증
    Django는 세션 (sessions)과 중간부품을 사용하여 인증 시스템에 Request 대상을 차단합니다.
    인증 시스템은 모든 요청(request)에 Request를 제공합니다.사용자 속성은 현재 사용자를 대표합니다.현재 사용자가 로그인하지 않으면 이 속성은 AnonymousUser의 실례로 설정됩니다. 그렇지 않으면 이 속성은 User의 실례가 됩니다.
    isauthenticated () 방법으로 그것들을 구분합니다.예를 들면 다음과 같습니다.
    if request.user.is_authenticated():
        # Do something for authenticated users.
        ...
    else:
        # Do something for anonymous users.
        ...

    사용자 로그인 방법 (log in)
    인증된 사용자가 있다면 현재 세션에 추가하려면login () 함수를 통해 실현할 수 있습니다.
    login(request,user)은 보기에서 로그인한 사용자가 login() 함수를 사용합니다. 이 함수는 두 개의 인자, HttpRequest 대상과 User 대상을 받아들입니다.login () 함수는 session에 사용자의 ID를 저장합니다.익명 세션에서 설정된 사람과 값은 사용자가 로그인한 후에 기록됩니다.다음은 authenticate() 및 login()의 인스턴스를 사용하는 방법입니다.
    from django.contrib.auth import authenticate, login
    
    def my_view(request):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                # Redirect to a success page.
            else:
                # Return a 'disabled account' error message
                ...
        else:
            # Return an 'invalid login' error message.
            ...

    사용자 대상은 authenticate () 방법을 호출해서 얻어야 합니다.데이터베이스에서 직접 꺼낸 사용자에게 로그인을 시도하면 오류가 발생합니다.
    사용자 로그아웃을 수행하는 방법 (log out)
    사용자 로그아웃을 실현하려면 logout () 함수를 사용하십시오. 이 함수는 HttpRequest의 대상을 매개 변수로 받아들일 수 있습니다.예를 들면 다음과 같습니다.
    from django.contrib.auth import logout
    
    def logout_view(request):
        logout(request)
        #         

    주의: logout () 는 사용자가 로그아웃에 실패한 경우 오류가 발생하지 않습니다.같은 브라우저의 후속 로그인 사용자가 이전에 로그인한 사용자의 데이터를 가져오는 것을 방지하기 위해서 logout () 함수를 호출하여 사용자에게 로그인할 때 현재 요청한 세션 데이터가 완전히 비워집니다.사용자가 로그인한 후에session에 데이터를 저장하려면django를 호출하십시오.contrib.auth.logout () 후 데이터를 저장하는 작업을 실행합니다.
    로그인한 사용자만 액세스 가능
    원시적 방법
    로그인을 제한하는 사용자의 페이지 접근을 제한하는 가장 간단하고 원시적인 방법은 Request를 검사하는 것입니다.user.is_authenticated() 및 경로 로그인 페이지로 재설정하기
    from django.conf import settings
    from django.shortcuts import redirect
    
    def my_view(request):
        if not request.user.is_authenticated():
            return redirect('%s?next=%s'%(settings.LOGIN_URL, request.path))
        # ...

    login 사용required decorator
    login_required(redirect field name='next', login url=None)를 사용하면login단축키로 사용할 수 있는 required() 장식기:
    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
        # ...

    장식기 loginrequired () 는 다음 내용을 완성했습니다.
  • 사용자가 로그인하지 않은 경우 구성 파일에서 LOGIN 으로 리디렉션URL이 가리키는 경로이며 현재 요청한 절대 경로를 조회 매개 변수로 로그인 페이지에 전달합니다.예: /account/login/?next=/polls/3/
  • 사용자가 로그인하면 보기 함수의 내용을 정상적으로 실행하고 보기 함수의 코드는 사용자가 로그인했다고 안전하게 가정할 수 있다.

  • 기본적으로 사용자는 인증에 성공한 후에 검색 문자열의'next'라는 매개 변수에 경로를 다시 지정해야 합니다.만약 이 인자로 다른 이름을 사용하는 경향이 있다면loginrequired () 는 선택할 수 있는 Redirect 를 가지고 있습니다.field_name 매개 변수:
    from django.contrib.auth.decorators import login_required
    
    @login_required(redirect_field_name='my_redirect_field')
    def my_view(request):
        ...

    login_required () 는 선택할 수 있는 인자login 을 수신합니다.url:
    from django.contrib.auth.decorators import login_required
    
    @login_required(login_url='/accounts/login/')
    def my_view(request):
        # ...

    login 을 지정하지 않으면url 매개 변수, 설정 파일의 LOGIN 을 설정해야 합니다URL이 로그인 페이지에 연결되어 있습니다.

    좋은 웹페이지 즐겨찾기