Accounts 앱 개발 가이드 정리
개괄
Django 프로젝트의 사용자 계정, 조직, 역할, 권한 관리를 담당하는 핵심 앱입니다. 사용자 인증, 회원가입, 조직 관리, 역할 기반 권한 제어 기능을 제공합니다.
주요 기능:
- 사용자 인증 (로그인/로그아웃)
- 사용자 등록
- 조직 관리
- 멤버십 관리 (사용자-조직 관계)
- 역할 기반 권한 관리
- 활성 조직 설정
향후 개발 방향:
- 없음
주제별 상세 설명
1. 모델
- User: Django의 기본
AbstractUser모델을 상속하여 사용자 정보를 관리합니다. - UserProfile:
User모델과 1:1 관계를 가지며, 향후 사용자 프로필 정보를 추가할 수 있습니다. 현재는 사용자 생성 시 자동으로 프로필을 생성하는 기능만 구현되어 있습니다. - Organization: 조직 정보(이름, 주소)를 저장합니다.
Sample Organization은 앱 설치 시 자동으로 생성되며, 모든 신규 사용자는 기본적으로Sample Organization의sub멤버십을 갖게 됩니다. - 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 Organization에sub멤버십으로 추가됩니다. 로그인 성공 시, 사용자가 속한 조직이 하나뿐이라면 해당 조직을 자동으로 활성 조직으로 설정합니다. - 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_service의user_has_org_permission함수를 활용합니다.
6. Admin
- admin.py: 각 모델에 대한 관리자 인터페이스를 제공합니다.
Membership모델의 경우,User와Organization에서 각각 Inline으로 표시됩니다.MembershipInlineForm을 사용하여 기존Membership의organization필드를 수정할 수 없도록 제한합니다.MembershipAdmin에서는 권한 관련 필드를 접을 수 있도록fieldsets를 구성했습니다.
7. 시그널
- apps.py:
post_migrate시그널을 사용하여 앱 설치 시Sample Organization을 자동으로 생성합니다. - models.py:
post_save시그널을 사용하여User생성 시 자동으로UserProfile을 생성합니다.
8. 추가적인 고려 사항
- 현재
UserProfile모델은 비어 있지만, 향후 사용자 프로필 정보를 추가할 예정입니다. Membership모델의clean메서드에서main멤버십 중복 및Sample Organization타입 제한 로직을 구현했습니다. 이러한 유효성 검사 로직은 중요하므로 변경 시 주의해야 합니다.- 권한 관리는
Role,Membership의additional_permissions,excluded_permissions를 통해 세분화하여 제어할 수 있습니다. 복잡한 권한 구조를 설계할 때 이를 활용하세요. active_org_id는 세션에 저장됩니다. 세션 관리 방식 변경 시 이 부분을 수정해야 합니다.- 템플릿에서 권한 검사를 위해
{% can_user 'app_label.codename' %}태그를 사용합니다.
협업 시 유의 사항
Membership모델의 유효성 검사 로직을 숙지하고, 새로운 기능 추가 시 충돌이 발생하지 않도록 주의해야 합니다.- 권한 관리 로직은
permission_service.py에 집중되어 있습니다. 권한 관련 기능을 추가하거나 수정할 때 해당 파일을 참조하세요. active_org_id는 사용자의 활성 조직을 나타내는 중요한 값입니다. 관련 기능 개발 시 이 값을 고려해야 합니다.LoginView와RegisterView에서 조직이 하나일 경우 자동으로 활성 조직으로 설정하는 부분을 유의하세요.Sample Organization은 기본 조직으로 사용됩니다. 삭제하거나 이름을 변경하지 마세요.

