Django의 auth 모듈(사용자 인증)에 대한 자세한 설명

不言
풀어 주다: 2018-04-17 10:41:35
원래의
3963명이 탐색했습니다.

이 글은 주로 Django의 auth 모듈(사용자 인증)에 대한 자세한 설명을 소개하고 있으니 참고하시기 바랍니다. 함께 살펴보겠습니다

auth 모듈은 로그인 인증 방법을 캡슐화한 것입니다. 이전에는 사용자가 입력한 사용자 이름과 비밀번호를 얻은 후 사용자 테이블에 쿼리하여 해당 개체가 있는지 확인해야 했습니다. 사용자 이름과 비밀번호가 일치합니다.

인증 모듈을 사용하면 사용자의 로그인 정보가 데이터베이스에 존재하는지 쉽게 확인할 수 있습니다.

또한 인증은 사용자가 로그인했는지 여부를 쉽게 확인할 수 있도록 세션을 캡슐화합니다.

auth의 메서드

인증 모듈 방법을 사용하려면 먼저 인증 모듈을 가져와야 합니다

from django.contrib import auth
로그인 후 복사

django.contrib.auth는 다양한 방법을 제공하며 여기서는 주로 그 중 4가지 방법을 소개합니다:

1, authenticate()

사용자 인증, 즉 사용자 이름과 비밀번호가 올바른지 확인하는 기능 제공 , 일반적으로 두 개의 키워드 매개변수인 사용자 이름과 비밀번호가 필요합니다.

인증 정보가 유효하면 사용자 개체가 반환됩니다. authenticate()는 사용자를 인증한 인증 백엔드를 식별하기 위해 User 객체에 속성을 설정하며, 이 정보는 후속 로그인 프로세스에서 필요합니다. authenticate() 없이 데이터베이스에서 직접 가져온 User 객체에 로그인하려고 하면 오류가 보고됩니다! !

user = authenticate(username='someone',password='somepassword')
로그인 후 복사

2, login(HttpRequest, user)

이 함수는 HttpRequest 개체와 인증된 User 개체를 허용합니다.

이 함수는 Django의 세션 프레임워크를 사용하여 인증된 사용자 업로드 세션 ID 및 기타 정보를 첨부합니다.

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:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...
로그인 후 복사

3, logout(request) 사용자 로그아웃

이 함수는 HttpRequest 객체를 받아들이고 반환 값이 없습니다. 이 함수가 호출되면 현재 요청에 대한 모든 세션 정보가 지워집니다. 사용자가 로그인하지 않은 경우에도 이 기능을 사용할 때 오류가 보고되지 않습니다.

from django.contrib.auth import logout
  
def logout_view(request):
  logout(request)
 # Redirect to a success page.
로그인 후 복사

4.is_authenticated() of the user object

Requirements:

1 사용자는 로그인 후에 특정 페이지에만 접근할 수 있습니다.

2 사용자가 로그인하지 않고 페이지에 접근하면, 로그인 페이지로 바로 이동합니다

3 사용자가 리디렉션된 로그인 인터페이스에서 로그인을 완료하면 액세스가 자동으로 이전에 방문한 주소로 이동합니다

방법 1:

인증의 is_authenticated() 메서드를 직접 사용하여 확인합니다.

def my_view(request):
   if not request.user.is_authenticated():
      return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
로그인 후 복사

방법 2:

request.user.username을 기반으로 확인합니다. 비어 있으면 로그인되지 않은 것입니다.

def my_view(request):
   if not request.user.username:
      return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
로그인 후 복사

방법 3:

django가 데코레이터를 설계했습니다. 이 상황에서는 login_requierd( )

from django.contrib.auth.decorators import login_required
   
@login_required
def my_view(request):
 ...
로그인 후 복사

사용자가 로그인하지 않은 경우 Django의 기본 로그인 URL '/accounts/login/'으로 이동합니다. (이 값은 다음을 통해 설정 파일에서 수정할 수 있습니다. 로그인_URL). 그리고 현재 액세스 URL의 절대 경로를 전달합니다(로그인에 성공하면 이 경로로 리디렉션됩니다).

사용자 개체

사용자 개체 속성: 사용자 이름, 비밀번호(필수) 비밀번호는 해시 알고리즘을 사용하여 데이터베이스에 저장됩니다.

is_staff: 사용자에게 웹사이트에 대한 관리 권한이 있는지 여부

is_active: 여부. user는 로그인이 허용됩니다. ``False``로 설정하면 사용자를 삭제하지 않고 사용자 로그인을 금지할 수 있습니다

2.1, is_authenticated()

실제 User 개체인 경우 반환 값은 항상 True입니다. 사용자가 인증을 통과했는지 확인하는 데 사용됩니다.

인증을 통과했다고 해서 사용자에게 권한이 있다는 의미는 아니며, 사용자가 활성 상태인지 확인하지도 않습니다. 단지 사용자가 인증에 성공했다는 의미일 뿐입니다. 이 방법은 매우 중요합니다. 백그라운드에서 request.user.is_authenticated()를 사용하여 사용자가 로그인했는지 확인합니다. true인 경우 request.user.name을 프런트 데스크에 표시할 수 있습니다.

2.2. . create_user 보조 기능을 사용하여 사용자를 생성합니다:

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
로그인 후 복사

2.3 , check_password(passwd)

user = User.objects.get(username=' ')
if user.check_password(passwd):
  ......
로그인 후 복사

사용자가 비밀번호를 변경해야 하는 경우 먼저 원래 비밀번호를 입력해야 합니다. 주어진 문자열이 비밀번호 검사를 통과하면 True를 반환합니다.

user = User.objects.get(username='')
user.set_password(password='')
user.save 
로그인 후 복사

2.5, 간단한 예

등록:

def sign_up(request):
 
  state = None
  if request.method == 'POST':
 
    password = request.POST.get('password', '')
    repeat_password = request.POST.get('repeat_password', '')
    email=request.POST.get('email', '')
    username = request.POST.get('username', '')
    if User.objects.filter(username=username):
        state = 'user_exist'
    else:
        new_user = User.objects.create_user(username=username, password=password,email=email)
        new_user.save()
 
        return redirect('/book/')
  content = {
    'state': state,
    'user': None,
  }
  return render(request, 'sign_up.html', content)  
로그인 후 복사

비밀번호 변경:

@login_required
def set_password(request):
  user = request.user
  state = None
  if request.method == 'POST':
    old_password = request.POST.get('old_password', '')
    new_password = request.POST.get('new_password', '')
    repeat_password = request.POST.get('repeat_password', '')
    if user.check_password(old_password):
      if not new_password:
        state = 'empty'
      elif new_password != repeat_password:
        state = 'repeat_error'
      else:
        user.set_password(new_password)
        user.save()
        return redirect("/log_in/")
    else:
      state = 'password_error'
  content = {
    'user': user,
    'state': state,
  }
  return render(request, 'set_password.html', content)
로그인 후 복사

Create User 테이블을 직접

위의 모든 작업은 django가 자동으로 생성한 auth_user 테이블에 대한 것이라는 점에 유의하세요. 이 테이블의 구조를 살펴보세요

이는 django가 자동으로 생성한 사용자 테이블이며, auth 모듈을 사용하려면 이 테이블을 사용(또는 상속)해야 합니다.

继承表的好处是我们可以增加一些自己需要的字段,并且同时可以使用auth模块提供的接口、方法

下面就讲一下继承auth的方法:

1、导入AbstractUser类,并且写一个自定义的类,继承AbstractUser类,如下:

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
  """
  用户信息
  """
  nid = models.AutoField(primary_key=True)
  telephone = models.CharField(max_length=11, null=True, unique=True)
  ......
로그인 후 복사

需要注意的是,UserInfo表里就不需要有auth_user里重复的字段了,比如说username以及password等,但是还是可以直接使用这些字段的,并且django会自动将password进行加密

2、这样写完之后,还需要在setting.py文件里配置:

AUTH_USER_MODEL = 'blog.UserInfo'
로그인 후 복사

这样,django就知道从blog项目下的models去查找UserInfo这张表了

相关推荐:

Django的cookie使用详解

Django中的Ajax使用方法

위 내용은 Django의 auth 모듈(사용자 인증)에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿