장고(Django) 개발: 권한(permission) 화면 관리

히즈웨드 |

    장고 프레임워크에서 권한(Permission)은 기본적으로 설계되어 있기 때문에 매우 짧은 코드로 구현 가능하다.


    작년에 장고(Django) 프레임워크로 프로젝트를 진행하면서 공부했던 개발 지식을 블로그에 다시 정리하려고 합니다. 개인 위키에 정리했던 것을 옮기는 수준이라, 친절한 설명은 기대하기 어렵고, 프로그래밍 언어와 파이썬 지식이 어느정도 있어야 이해할 수 있을 것입니다.


    아래 내용들은 Django 1.6~1.7 버전을 기준으로하고, "쉽고 빠른 웹개발 Django"란 책에서 1/3, 공식 위키에서 1/3, 그리고 나머지는 구글링을 바탕으로 정리한 지식입니다. 말투가 존대와 반말이 섞여있어도 이해바랍니다 :)




    1 관리자 화면에서 권한

    2 뷰에서 권한

    3 템플릿에서 권한





    1 관리자 화면에서 권한 관리

    사용자 기본 권한

    • Active (활성) : 로그인 할 수 있는 권한
    • Staff (스태프 권한) : 관리자 화면에 들어올 수 있는 권한
    • Superuser (최상위 사용자 권한) : 최고 관리자 (최초 생성 계정과 동일)

     권한의 종류

    • 특정 모델 객체 추가 (add)
    • 특정 모델 객체 변경 (change)
    • 특정 모델 객체 삭제 (delete)

    그룹 권한

    그룹에 권한을 부여함으로써, 그룹에 속한 모든 사용자의 권한을 효율적으로 관리
    권한 부여 방법이 사용자와 동일함



    2 뷰에서 권한 제어

    has_perm 함수

    뷰 함수 내부에서 사용자가 특정 권한을 가지고 있는지 확인하려면 User 객체의 has_perm 메서드 사용한다.

    사용법 : user.has_perm(앱이름.행위_모델명)

    • 앱이름 : 모델이 속한 앱 이름
    • 행위 : add | change | delete
    • 모델명 : 모델 이름
    # 태그를 추가할 수 있는가?
    user.has_perm('boookmark.add_tag')

    권한 데코레이터

    권한을 뷰 함수 전체에 적용해야 하는 경우 사용

    @login_required : 로그인 한 사용자만 허용

    # 로그인 한 사용자만 bookmark_save_page 뷰에 접근 허용
    from django.contrib.auth.decorators import login_required
     
    @login_required
    def bookmark_save_page(request):
        #생략

    기본 LOGIN_URL은 /account/login/ 이기 때문에, 만약 다르면 변경이 필요함. settings.py에서

    import django.contrib.auth
    LOGIN_URL = '/login/'

    @permission_required('권한', 리다이렉트주소) : 명시된 권한을 가진 사용자만 허용

    # 북마크를 추가할 수 있는 사용자만 bookmark_save_page 뷰에 접근 허용
    from django.cotrib.auth.decorators import permission_required
     
    @permission_required('bookmarks.add_bookmark', login_url="/login/")
    def bookmark_save_page(request):
        # 생략



    3 템플릿에서 권한 제어

    {% user.is_authenticated %}

    로그인 한 사용자만 허용

    {% if user.is_authenticated %}
        <a href="/user/{{ user.username }}/">{{ user.username }}</a>님, 안녕하세요.
            (<a href="/password_change/">비밀번호 변경</a>|<a href="/logout/">로그아웃</a>)
    {% else %}
        <a href="/login/">로그인</a> |
        <a href="/register/">가입</a>
    {% endif %}