Skip to content

RBAC role/permission matrix 확정 #46

Description

@yoonki1207

작업 설명

docs/rbac_permission_matrix.md에 정의된 RBAC Permission Matrix를 기준으로 권한 판정 비즈니스 로직을 구현한다.

현재 RBAC 구조는 User에게 직접 권한을 부여하지 않고, User가 속한 Team을 통해 리소스 권한을 판단한다. Team은 Organization 안에서 role/tag처럼 동작하며, 실제 리소스 권한은 Team별 permission row와 auth_state로 결정한다.

상세 작업

  • auth_state 우선순위 정의
    • none = 0
    • read = 1
    • execute = 2
    • write = 3
    • manage = 4
    • admin = 5
- Organization membership 판정 로직 구현
  - 별도 Organization membership 테이블을 사용하지 않는다.
  - `team_memberships`를 Organization membership의 source of truth로 사용한다.
  - User가 Organization 안에서 속한 active Team 목록을 조회한다.

- 공통 권한 판정 흐름 구현
  - 요청 User 식별
  - 요청 Organization context 결정
  - User의 Organization 내 Team 목록 조회
  - 요청 리소스에 연결된 Team permission row 조회
  - User Team과 permission Team의 교집합 확인
  - active Team만 인정
  - 가장 높은 `auth_state` 선택
  - required auth_state 이상인지 검증
  - 리소스 Organization scope 검증

- 리소스별 permission table 기반 판정 구현
  - Workflow: `team_workflow_permissions`
  - KnowledgeBase: `team_knowledge_permissions`
  - LLM Credential: `team_llm_permissions`
  - Audit: `team_audit_permissions`

- Organization / Team 관리 정책 구현
  - Organization 권한은 별도 permission table 없이 기본 Team 이름 기반 정책으로 판단한다.
  - Team 관리 권한도 기본 Team 이름 기반 정책으로 판단한다.
  - 기본 `member` Team은 삭제할 수 없도록 한다.
  - Organization member는 최소 하나의 TeamMembership을 가져야 한다.

- 예외 정책 반영
  - Public App 실행은 Team RBAC 대신 공개 설정과 secret 검증을 기준으로 처리한다.
  - Webhook 실행은 session이 아닌 webhook secret 또는 deployment auth_secret으로 검증한다.
  - Public/Webhook의 관리, 배포, 로그 조회에는 Workflow 권한을 적용한다.

- 실패 응답 정책 반영
  - 인증 정보 없음: `401 authentication_required`
  - Organization member 아님: `403 organization_membership_required`
  - 리소스 권한 row 없음: `403 resource_permission_required`
  - 권한 단계 부족: `403 insufficient_auth_state`
  - 리소스 없음: `404 resource_not_found`
  - 권한 때문에 숨겨야 하는 리소스: `404 resource_not_found`

참고 사항

  • 기준 문서: docs/rbac_permission_matrix.md
  • 관련 문서: docs/rbac_relationships.md
  • 관련 문서: docs/team_permission_db_design.md
  • 관련 문서: docs/team_workspace_plan.md
  • 현재 구조에는 명시적 deny가 없으므로 allow 기반으로만 판단한다.
  • 권한 row가 없으면 none으로 처리한다.
  • User가 여러 Team에 속한 경우 가장 높은 auth_state를 최종 권한으로 사용한다.

Metadata

Metadata

Assignees

Labels

Type

No type

Fields

Priority

None yet

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions