[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. 테스트 (관리자 권한 부여)
이제 일반 유저 계정 하나를 "게시판 매니저"로 승진시켜서 테스트해 봅시다.
- 슈퍼유저 로그인: /admin 페이지로 접속해서 로그인합니다.
- 유저 수정: Users 메뉴에서 테스트용 아이디(예: testuser)를 클릭합니다.
- 권한 부여: 스크롤을 내려서 게시판 관리자 여부 (is_board_manager) 체크박스에 체크하고 저장합니다.
- 삭제 테스트:
- 이제 그 testuser로 사이트에 로그인합니다.
- "다른 사람"이 쓴 글이나 댓글에 가봅니다.
- [삭제] 버튼이 보이나요?
- 버튼을 눌렀을 때 실제로 삭제가 되나요?
'Step by Step > [phase 2] django community upgrade' 카테고리의 다른 글
| Bonus Book 2. Django Admin 커스터마이징 (0) | 2025.12.09 |
|---|---|
| 8. 디테일 업그레이드 ( 조회수 쿠키 & Humanize) (0) | 2025.12.07 |
| 7. 사용자 간 1:1 쪽지 기능(DM) 구현 (0) | 2025.12.07 |
| 6. 회원 프로필(닉네임 & 아바타) (0) | 2025.12.07 |
| 5. 메인 페이지(대시보드 & 데이터 조회) 구현 (0) | 2025.12.07 |