Bonus Book 1. 게시판 관리자(Staff) 권한 부여

[Bonus Book 1] 게시판 관리자(Staff) 권한 부여

슈퍼유저(Superuser)는 너무 강력한 권한(모든 것 가능)을 가지므로, 평소에는 "게시판 관리자(Board Manager)" 권한만 가진 계정으로 활동하는 것이 보안상 안전합니다.

1. 모델 확인 (accounts/models.py)

우리가 Phase 1에서 User 모델을 만들 때, 미리 is_board_manager 라는 필드를 만들어 둔 것을 기억하시나요? 드디어 이것을 써먹을 때입니다.

혹시 기억이 안 나실까 봐 코드를 다시 확인해 봅니다. (수정할 필요는 없습니다. 눈으로만 확인하세요.)

# accounts/models.py
class User(AbstractUser):
    # 이 필드를 활용합니다!
    is_board_manager = models.BooleanField(default=False, verbose_name="게시판 관리자 여부")
    # ...

2.관리자 화면에 커스텀 필드 추가하기

accounts/admin.py 파일을 열고 아래 코드로 전체 내용을 교체해 주세요.

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

class CustomUserAdmin(UserAdmin):
    # [1] 목록 화면에서 보이는 컬럼 설정
    # (기본) 아이디, 이메일, 이름, 스태프여부 + (추가) 닉네임, 게시판관리자여부
    list_display = ('username', 'nickname', 'email', 'is_board_manager', 'is_staff', 'is_superuser')
    
    # [2] 수정 화면(상세)에서 보이는 필드 설정 (fieldsets)
    # 기존 UserAdmin의 설정 뒤에 '추가 정보' 섹션을 붙입니다.
    fieldsets = UserAdmin.fieldsets + (
        ('추가 정보', {'fields': ('nickname', 'avatar', 'is_board_manager')}),
    )

# User 모델을 우리가 만든 CustomUserAdmin 설정으로 등록
admin.site.register(User, CustomUserAdmin)

3. 권한 체크 로직 수정 (boards/views.py)

기존의 삭제 로직은 "작성자가 아니면 튕겨내라!" 였습니다.

이것을 "작성자가 아니고, 관리자도 아니면 튕겨내라!" 로 바꿔야 합니다.

boards/views.py에서 board_delete(게시글 삭제)와 comment_delete(댓글 삭제) 함수를 찾아 수정합니다.

 

1) 게시글 삭제 (board_delete) 수정

@login_required
def board_delete(request, board_code, pk):
    board = get_object_or_404(Board, code=board_code)
    post = get_object_or_404(Post, pk=pk, board=board)
    
    # [수정] 작성자 본인이거나, '게시판 관리자' 권한이 있는 경우 삭제 허용
    if request.user == post.author or request.user.is_board_manager or request.user.is_superuser:
        post.delete()
        return redirect('boards:board_list', board_code=board_code)
    else:
        # 권한 없는 사람이 시도하면 에러 페이지(403)를 띄우거나 뒤로 보냄
        # 여기서는 간단하게 상세 페이지로 돌려보냄
        return redirect('boards:board_detail', board_code=board_code, pk=pk)

 

2) 댓글 삭제 (comment_delete) 수정

@login_required
def comment_delete(request, board_code, pk, comment_pk):
    post = get_object_or_404(Post, board__code=board_code, pk=pk)
    comment = get_object_or_404(Comment, pk=comment_pk, post=post)

    # [수정] 작성자 본인 or 관리자 or 슈퍼유저 허용
    if request.user == comment.author or request.user.is_board_manager or request.user.is_superuser:
        comment.delete()
    
    return redirect('boards:board_detail', board_code=board_code, pk=pk)

4. 화면 수정 (boards/templates/boards/board_detail.html)

삭제 버튼도 마찬가지입니다. 지금은 "내 글"일 때만 삭제 버튼이 보입니다.

"내가 쓴 글이 아니더라도, 내가 관리자라면 삭제 버튼이 보여야" 합니다.

board_detail.html에서 게시글 삭제 버튼과 댓글 삭제 버튼의 if 조건을 수정하세요.

 

1) 게시글 삭제 버튼 부분

{% if post.author == user or user.is_board_manager or user.is_superuser %}
    <a href="{% url 'boards:board_edit' board.code post.pk %}" class="btn btn-secondary">수정</a>
    <a href="{% url 'boards:board_delete' board.code post.pk %}" class="btn btn-danger" onclick="return confirm('정말 삭제하시겠습니까?');">삭제</a>
{% endif %}

 

2) 댓글 삭제 버튼 부분 (반복문 안쪽)

{% if comment.author == user or user.is_board_manager or user.is_superuser %}
    <a href="{% url 'boards:comment_delete' board.code post.pk comment.pk %}" 
       class="text-danger small text-decoration-none ms-2"
       onclick="return confirm('댓글을 삭제하시겠습니까?')">삭제</a>
{% endif %}

5. 테스트 (관리자 권한 부여)

이제 일반 유저 계정 하나를 "게시판 매니저"로 승진시켜서 테스트해 봅시다.

  1. 슈퍼유저 로그인: /admin 페이지로 접속해서 로그인합니다.
  2. 유저 수정: Users 메뉴에서 테스트용 아이디(예: testuser)를 클릭합니다.
  3. 권한 부여: 스크롤을 내려서 게시판 관리자 여부 (is_board_manager) 체크박스에 체크하고 저장합니다.
  4. 삭제 테스트:
    • 이제 그 testuser로 사이트에 로그인합니다.
    • "다른 사람"이 쓴 글이나 댓글에 가봅니다.
    • [삭제] 버튼이 보이나요?
    • 버튼을 눌렀을 때 실제로 삭제가 되나요?