Authentication
Authorization
auth에 관련되어 Django 내부적으로 accounts라는 이름으로 사용되고 있기 때문에 되도록 auth 관련 앱 이름은 accounts로 지정하는 것을 권장
Context processors
Users
로그아웃은 session을 삭제하는 로직
HttpRequest 객체를 인자로 받고 반환값이 없음
사용자가 로그인하지 않은 경우 오류를 발생시키지 않음
현재 요청에 대한 session data를 DB에서 완전히 삭제하고, 클라이언트의 쿠키에서도 sessionid가 삭제됨
이는 다른 사람이 동일한 웹 브라우저를 사용하여 로그인하고, 이전 사용자의 세선 데이터에 액세스하는 것을 방지하기 위함
User model의 속성 중 하나
모든 User 인스턴스에 대해 항상 True인 읽기 전용 속성
사용자가 인증되었는지 여부를 알 수 있는 방법
일반적으로 request.user에서 이 속성을 사용하며, 미들웨어의 'django.contib.auth.middleware.AuthenticationMiddleware'를 통과했는지 확인
단 권한과 고나련 없으며 사용자가 활성화 상태이거나 유효한 세션을 가지고 있는지도 확인하지 않음
적용
{% if request.user.is_authenticated %}
<h3>Hello, {{user}}</h3>
<form action="{% url 'accounts:logout' %}" method="POST">
{% csrf_token %}
<input class="btn btn-danger" type="submit" value = "Logout">
</form>
{% else %}
<a href="{% url 'accounts:login' %}" class="btn btn-info" >Login</a>
{% endif %}
@require_http_methods(['GET','POST'])
def login(request) :
if request.user.is_authenticated:
return redirect('articles:index')
@require_POST
def logout(request):
if request.user.is_authenticated :
auth_logout(request)
return redirect('articles:index')
사용자가 로그인되어 있지 않으면, settings.LOGIN_URL에 설정된 문자열 기반 절대 경로로 redirect 함
사용자가 로그인되어 있으면 정상적으로 view 함수를 실행
인증 성공 시 사용자가 redirect 되어야하는 경로는 'next'라는 쿼리 문자열 매개 변수에 저장됨
view 함수에 login_required 데코레이터 작성
비로그인 상태에서 account/create 경로로 요청 보내기
@require_POST
def likes(request, article_pk):
if request.user.is_authenticated:
article = get_object_or_404(Article, pk=article_pk)
if article.like_users.filter(pk=request.user.pk).exists():
article.like_users.remove(request.user)
else:
article.like_users.add(request.user)
if request.GET.get('next') :
return redirect(request.GET.get('next') )
return redirect('articles:index')
return redirect('accounts:login')
{% url 'articles:likes' article.pk %}?next=/accounts/{{person.username}}
@require_http_methods(['GET','POST'])
def signup(request) :
if request.user_is_authenticated:
return redirect('articles:index')
if request.method == 'POST' :
form=UserCreationForm(request.POST)
if form.is_valid() :
user = form.save()
auth_login(request,user)
return redirect('articles:index')
else :
form = UserCreationForm()
context = {
'form' :form,
}
return render(request, 'accounts/signup.html',context)
update_session_auth_hash(request,user)
현재요청과 새 session hash가 파생될 업데이트 된 사용자 객체를 가져오고, session hash를 적절하게 업데이트
비밀번호가 변경되면 기존 세션과 회원 인증 정보가 일치하지 않게 되어 로그인 상태를 유지할 수 없