Accounts 앱 개발 가이드 정리

개괄

Django 프로젝트의 사용자 계정, 조직, 역할, 권한 관리를 담당하는 핵심 앱입니다. 사용자 인증, 회원가입, 조직 관리, 역할 기반 권한 제어 기능을 제공합니다.

주요 기능:

  • 사용자 인증 (로그인/로그아웃)
  • 사용자 등록
  • 조직 관리
  • 멤버십 관리 (사용자-조직 관계)
  • 역할 기반 권한 관리
  • 활성 조직 설정

향후 개발 방향:

  • 없음

주제별 상세 설명

1. 모델

  • User: Django의 기본 AbstractUser 모델을 상속하여 사용자 정보를 관리합니다.
  • UserProfile: User 모델과 1:1 관계를 가지며, 향후 사용자 프로필 정보를 추가할 수 있습니다. 현재는 사용자 생성 시 자동으로 프로필을 생성하는 기능만 구현되어 있습니다.
  • Organization: 조직 정보(이름, 주소)를 저장합니다. Sample Organization은 앱 설치 시 자동으로 생성되며, 모든 신규 사용자는 기본적으로 Sample Organizationsub 멤버십을 갖게 됩니다.
  • Role: 권한 그룹을 나타내며, 여러 개의 Permission을 가질 수 있습니다. admin.py에서 filter_horizontal을 사용하여 권한을 편리하게 관리할 수 있습니다.
  • Membership: 사용자와 조직 간의 관계를 정의합니다. membership_type(main, sub)으로 구분되며, 한 사용자는 하나의 main 멤버십만 가질 수 있습니다. roles, additional_permissions, excluded_permissions 필드를 통해 세분화된 권한 관리를 지원합니다. Sample Organization은 항상 sub 타입으로만 설정 가능합니다.

2. 뷰

  • LoginView: 사용자 로그인 기능을 제공합니다. 로그인 성공 시, 사용자가 속한 조직이 하나뿐이라면 해당 조직을 자동으로 활성 조직으로 설정합니다.
  • LogoutView: 사용자 로그아웃 기능을 제공합니다.
  • RegisterView: 사용자 등록 기능을 제공합니다. 회원가입 시 자동으로 Sample Organizationsub 멤버십으로 추가됩니다. 로그인 성공 시, 사용자가 속한 조직이 하나뿐이라면 해당 조직을 자동으로 활성 조직으로 설정합니다.
  • SetActiveOrganizationView: 사용자가 속한 여러 조직 중 활성 조직을 선택하는 기능을 제공합니다. 선택된 조직 ID는 세션(active_org_id)에 저장됩니다.

3. 폼

  • UserLoginForm: 사용자 로그인 폼입니다. username, password 필드를 사용합니다.
  • UserRegisterForm: 사용자 등록 폼입니다. Django의 UserCreationForm을 상속하여 사용하며, username, email, password 필드를 사용합니다.

4. 서비스

  • permission_service.py: user_has_org_permission 함수는 사용자가 특정 조직에서 지정된 권한을 가지고 있는지 검사합니다. 멤버십의 역할, 추가 권한, 제외 권한을 고려하여 판단합니다.

5. 템플릿 태그

  • permission_tags.py: can_user 태그는 템플릿에서 현재 사용자가 활성 조직에서 특정 권한을 가지고 있는지 확인하는 데 사용됩니다. permission_serviceuser_has_org_permission 함수를 활용합니다.

6. Admin

  • admin.py: 각 모델에 대한 관리자 인터페이스를 제공합니다. Membership 모델의 경우, UserOrganization에서 각각 Inline으로 표시됩니다. MembershipInlineForm을 사용하여 기존 Membershiporganization 필드를 수정할 수 없도록 제한합니다. MembershipAdmin에서는 권한 관련 필드를 접을 수 있도록 fieldsets를 구성했습니다.

7. 시그널

  • apps.py: post_migrate 시그널을 사용하여 앱 설치 시 Sample Organization을 자동으로 생성합니다.
  • models.py: post_save 시그널을 사용하여 User 생성 시 자동으로 UserProfile을 생성합니다.

8. 추가적인 고려 사항

  • 현재 UserProfile 모델은 비어 있지만, 향후 사용자 프로필 정보를 추가할 예정입니다.
  • Membership 모델의 clean 메서드에서 main 멤버십 중복 및 Sample Organization 타입 제한 로직을 구현했습니다. 이러한 유효성 검사 로직은 중요하므로 변경 시 주의해야 합니다.
  • 권한 관리는 Role, Membershipadditional_permissions, excluded_permissions를 통해 세분화하여 제어할 수 있습니다. 복잡한 권한 구조를 설계할 때 이를 활용하세요.
  • active_org_id는 세션에 저장됩니다. 세션 관리 방식 변경 시 이 부분을 수정해야 합니다.
  • 템플릿에서 권한 검사를 위해 {% can_user 'app_label.codename' %} 태그를 사용합니다.

협업 시 유의 사항

  • Membership 모델의 유효성 검사 로직을 숙지하고, 새로운 기능 추가 시 충돌이 발생하지 않도록 주의해야 합니다.
  • 권한 관리 로직은 permission_service.py에 집중되어 있습니다. 권한 관련 기능을 추가하거나 수정할 때 해당 파일을 참조하세요.
  • active_org_id는 사용자의 활성 조직을 나타내는 중요한 값입니다. 관련 기능 개발 시 이 값을 고려해야 합니다. LoginViewRegisterView에서 조직이 하나일 경우 자동으로 활성 조직으로 설정하는 부분을 유의하세요.
  • Sample Organization은 기본 조직으로 사용됩니다. 삭제하거나 이름을 변경하지 마세요.