본문으로 건너뛰기

**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
MenuNameROLE_ROOTROLE_ADMINROLE_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.