[Django] 로그인 사용자에 대한 접근 제한하기 (is_authenticated)

문지은·2023년 4월 30일
0

Django 기초

목록 보기
14/14
post-thumbnail

is_authenticated attribute을 활용하여 로그인 사용자에 대한 접근을 제한하는 방법에 대해 알아보자!


is_authenticated

  • User model의 속성(attributes) 중 하나
  • 사용자가 인증되었는지 여부를 알 수 있는 방법
  • 모든 User 인스턴스에 대해 항상 True인 읽기 전용 속성
    • AnonymousUser에 대해서는 항상 False
  • 일반적으로 request.user에서 이 속성을 사용 (request.user.is_authenticated)
  • 권한(permission)과는 관련이 없으며, 사용자가 활성화 상태(activate)이거나 유효한 세션(valid session)을 가지고 있는지도 확인하지 않음

is_authenticated 적용하기

로그인과 비로그인 상태에서 출력되는 링크를 다르게 설정하기

<!-- base.html -->

{% if user.is_authenticated %}
  <form action="{% url 'accounts:logout' %}" method="POST">
      {% csrf_token %}
      <input type="submit" value="로그아웃">
  </form>
  <a href="{% url 'accounts:update' %}">회원정보 수정</a>
  <form action="{% url 'accounts:delete' %}" method="POST">
    {% csrf_token %}
    <input type="submit" value="회원탈퇴">
  </form>
  <h3 id="user-hello"><i>안녕하세요, {{user}} 님 !</i></h3>
{% else %}
  <a href="{% url 'accounts:signup' %}">회원가입</a>
  <a href="{% url 'accounts:login' %}">로그인</a>
{% endif %}

인증된 사용자만 게시글 작성 링크를 볼 수 있도록 처리하기

  • 하지만 아직 비 로그인 상태로도 URL을 직접 입력하면 게시글 작성 페이지로 갈 수 있음
<!-- articles/index.html -->

{% extends 'base.html' %} 

{% block content %}
  <h1>INDEX</h1>

  {% if request.user.is_authenticated %}
    <a href="{% url 'articles:create' %}">작성하기</a>
    <hr>
  {% else %}
    <a href="{% url 'accounts:login' %}">새 글을 작성하려면 로그인 하세요</a>
  {% endif %}
  
  {% for article in articles %}
    <p>
      [{{article.id}}] <a href="{% url 'articles:detail' article.pk %}" id="article-title">{{article.title}}</a>
    </p>
    <hr />
  {% endfor %} 

{% endblock content %}

인증된 사용자라면 로그인 로직을 수행할 수 없도록 처리하기

# accounts/views.py

def login(request):
    if request.user.is_authenticated:
        return redirect('articles:index')
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            return redirect('articles:index')
    else:
        form = AuthenticationForm()

    context = {'form': form}
    return render(request, 'accounts/login.html', context)
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글