티스토리 뷰
Django Autentication(인증)
대부분의 웹사이트에서는 현재 접속한 사용자가 로그인을 했는지, 로그인을 했다면 어떤 사용자이고 어떤 권한을 가지
고 있는지에 따라 사용할 수 있는 기능이나 페이지에 제한을 두고 있습니다. 이와 같은 로직을 구현하기 위해서는 먼저
사용자를 인증하는 과정을 거쳐야 합니다. Django에서는 이런 사용자 인증 및 권한 승인 시스템을 다양한 기능들과 함
께 제공하고 있습니다.
User
Django에서는 User 객체를 이용하여 계정를 관리하며 User 속성으로는 아래와 같다.
- username (required) - like ID
- password (required)
- first_name
- last_name
1. User 생성 - 회원 가입
create_user(username, email=None, password=None, **extra_fields)
from django.contrib.auth.models import User
def signUp(request):
# 방법 1
user = User.objects.create_user('abc', 'abc@abc.com', 'password')
# 방법 2
user = User.objects.create_user(username='abc', email='abc@abc.com', password='password')
- 비밀번호는 해시되어 데이터베이스에 저장된다.
처음에 admin 페이지에 접속하기 위해 createsuperuser 명령을 날려 슈퍼 유저를 생성한 것처럼 다음 함수로 슈퍼 유저
를 생성할 수 있다.
-
create_superuser(username, email, password, **extra_fields)
: 기본적으로
create_user()
와 비슷하나is_staff
와is_superuser
속성이 True로 설정된다.
from django.contrib.auth.models import User
def createSuperUser(request):
superUser = create_superuser('abc', 'abc@abc.com', 'password')
2. User 정보 수정
from django.contrib.auth.models import User
user = User.objects.get(username='abc')
user.email='123@abc.com'
user.set_password('new password') # 비밀번호 변경
user.save() # 수정 후 save()를 해야 영구적으로 반영됨
- 비밀번호가 변경되면 모든 세션이 로그아웃된다.
3. User 인증 및 로그인
-
authenticate(request=None, **credentials)
: User 인증 함수. 자격 증명이 유효한 경우 User 객체를, 그렇지 않은 경우 None을 반환
-
login(request, user, backend=None)
: 로그인 함수. Django의 세션 프레임 워크를 사용하여 세션에 인증된 사용자의 ID를 저장
from django.contrib.auth import authenticate, login
def login(request):
username = request.POST['username']
password = request.POST['password']
# username과 password로 자격 증명
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# 로그인 성공
...
else:
# 로그인 실패
...
4. 인증 확인
로그인인한 사용자만 사용할 수 있는 페이지나 기능 등을 위해 현재 사용자가 인증되어 있는지 확인해야 한다.
먼저, 인증 실패시 리다이렉트할 경로를 지정한다.
# settings.py
...
LOGIN_URL = '/login/'
...
4.1 View에서의 인증 확인
Django는 세션과 미들웨어를 사용하여 인증 시스템을 요청 객체에 연결한다. 그 후 모든 Request에 현재 사용자를 나타
내는 request.user 속성을 제공한다. 현재 사용자가 로그인한 경우 User 객체를, 로그인 하지 않은 경우 AnonymousUser
객체로 설정된다.
is_authenticated
: 대상 User 객체의 로그인 여부를 확인
def example(request):
if request.user.is_authenticated:
# 로그인한 유저인 경우
...
else:
# 로그인 하지 않은 유저인 경우
...
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
'%s?next=%s'
: 기본적으로 인증 성공시 사용자를 리다이렉트하는 경로는 "next"라는 쿼리 문자열 매개 변수에 저장
login_required()
데코레이터를 사용하면 로그인하지 않은 유저에 대한 처리를 위의 방법보다 더 간단하게 구현할 수 있다.
-
login_required(redirect_field_name='next', login_url=None)
: 지정된 인자값이 없을 경우, settings.py에 설정한
LOGIN_URL
로 리다이렉트
from django.contrib.auth.decorators import login_required
@login_required
def example1(request):
...
@login_required(redirect_field_name='login')
def example2(request):
...
@login_required(login_url='/accounts/login/')
def example3(request):
...
4.2 Template에서의 인증 확인
...
{% if user.is_authenticated %}
<a href="{% url 'login:signout' %}">로그아웃</a>
{% else %}
<a href="{% url 'login:signin' %}">로그인</a>
{% endif %}
...
5. 로그아웃
logout(request)
: 현재 request에 대한 세션 데이터를 모두 삭제
from django.contrib.auth import logout
def logout(request):
logout(request)
참고 자료
'Django' 카테고리의 다른 글
[Django Basic 12] Static File & Media File (0) | 2020.02.26 |
---|---|
[Django Basic 11] User 모델 확장 (0) | 2020.02.17 |
[Django Basic 09] {% csrf_token %} (0) | 2020.02.09 |
[Django Basic 08] URL Reverse (0) | 2020.02.09 |
[Django Basic 07] settings.py에서 SECRET_KEY 분리하기 (0) | 2020.02.07 |
- Total
- Today
- Yesterday
- Django application
- Django 팔로우
- Django 검색
- java
- Django 회원 정보 수정
- Django
- Redis Cache
- Django 프로젝트 생성
- query parameter
- 서점 어플리케이션
- 장고
- 북마크 어플리케이션
- Django 컬렉션
- Django 비밀번호 수정
- Django 북마크
- Django 어플리케이션
- Django 로그인
- Django 좋아요
- python
- Django 업로드
- Redis
- Django 인스타그램
- Django 로그아웃
- Django User
- Django 해시태그
- Django 댓글
- MySQL
- 파이썬
- Django Instagram
- Django 회원가입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |