**Menu Permissions**
이 페이지에서는 jCasbin을 사용하여 메뉴 기반 접근 제어를 구현한 Spring Boot 예제를 보여줍니다. 동일한 패턴(정책 + 역할 할당 + 메뉴 계층 구조)은 Casbin이 지원하는 다른 언어에도 적용할 수 있습니다.
1. Configuration
policy.csv에서 역할–메뉴 권한, 사용자–역할 할당, 메뉴 계층 구조를 정의합니다. 전체 예제: jCasbin menu permission.
1.1 Overview
정책 파일은 다음을 정의합니다: (1) 어떤 역할이 어떤 메뉴 항목에 접근할 수 있는지, (2) 어떤 사용자가 어떤 역할을 가지고 있는지, (3) 메뉴 항목 간의 부모–자식 관계. 이를 통해 역할 기반의 계층적 메뉴 가시성이 제공됩니다.
1.2 Permission rules (p)
p로 시작하는 줄은 역할(sub)이 메뉴 항목(obj)에서 특정 작업(act)을 수행할 수 있는지 여부를 정의합니다. 효과(eft)는 allow 또는 deny입니다.
예시:
p, ROLE_ROOT, SystemMenu, read, allow는ROLE_ROOT에SystemMenu읽기 접근 권한을 부여합니다.p, ROLE_ROOT, UserMenu, read, deny는ROLE_ROOT의UserMenu읽기 접근 권한을 거부합니다.
1.3 User–role assignments (g)
g로 시작하는 줄은 사용자를 역할에 할당하고 역할 상속을 정의합니다. 사용자는 모든 역할의 권한 합집합을 갖게 됩니다.
예시:
g, user, ROLE_USER는 이름이user인 사용자를ROLE_USER에 할당합니다.g, ROLE_ADMIN, ROLE_USER는ROLE_ADMIN이ROLE_USER의 모든 권한을 상속하도록 합니다.
1.4 Menu hierarchy (g2)
g2로 시작하는 줄은 부모–자식 메뉴 구조를 정의합니다.
예시:
g2, UserSubMenu_allow, UserMenu는UserSubMenu_allow를UserMenu의 자식으로 만듭니다.g2, (NULL), SystemMenu는SystemMenu를 상위 메뉴가 없는 최상위 메뉴로 표시합니다.
1.5 메뉴 권한 상속
- 상위 메뉴에 명시적
allow이 있는 경우, 하위 메뉴에 명시적deny가 없다면 하위 메뉴도allow을 상속받습니다. 즉, 상위 메뉴를 허용하면 하위 메뉴도 허용됩니다. - 상위 메뉴에 명시적 권한이 없지만 적어도 하나의 하위 메뉴에
allow이 있는 경우, 사용자가 해당 하위 메뉴에 접근할 수 있도록 상위 메뉴는allow으로 처리됩니다.
1.6 거부(Deny) 및 역할 상속
- **명시적 거부(deny)**가 우선합니다: 역할이 특정 메뉴에 대해 명시적으로 거부되면, 해당 역할을 상속하는 다른 역할도 거부됩니다. 거부는 상속으로 덮어쓸 수 없습니다.
- 암시적 거부(implicit deny)(
allow규칙 없음)는 덮어쓸 수 있습니다: 더 높은 권한의 역할이 해당 메뉴에 대해 명시적allow을 추가할 수 있습니다.
1.7 정책 예시
p, ROLE_ROOT, SystemMenu, read, allow
p, ROLE_ROOT, AdminMenu, read, allow
p, ROLE_ROOT, UserMenu, read, deny
p, ROLE_ADMIN, UserMenu, read, allow
p, ROLE_ADMIN, AdminMenu, read, allow
p, ROLE_ADMIN, AdminSubMenu_deny, read, deny
p, ROLE_USER, UserSubMenu_allow, read, allow
g, user, ROLE_USER
g, admin, ROLE_ADMIN
g, root, ROLE_ROOT
g, ROLE_ADMIN, ROLE_USER
g2, UserSubMenu_allow, UserMenu
g2, UserSubMenu_deny, UserMenu
g2, UserSubSubMenu, UserSubMenu_allow
g2, AdminSubMenu_allow, AdminMenu
g2, AdminSubMenu_deny, AdminMenu
g2, (NULL), SystemMenu
| MenuName | ROLE_ROOT | ROLE_ADMIN | ROLE_USER |
|---|---|---|---|
| SystemMenu | ✅ | ❌ | ❌ |
| UserMenu | ❌ | ✅ | ❌ |
| UserSubMenu_allow | ❌ | ✅ | ✅ |
| UserSubSubMenu | ❌ | ✅ | ✅ |
| UserSubMenu_deny | ❌ | ✅ | ❌ |
| AdminMenu | ✅ | ✅ | ❌ |
| AdminSubMenu_allow | ✅ | ✅ | ❌ |
| AdminSubMenu_deny | ✅ | ❌ | ❌ |
2. 메뉴 권한 적용
jCasbin menu permission 예제에서 MenuService는 findAccessibleMenus()(사용자가 볼 수 있는 모든 메뉴)와 checkMenuAccess()(단일 메뉴 확인)를 제공합니다. 두 함수 모두 내부적으로 jCasbin enforcer를 사용합니다.
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.