본 블로그에서는 이전 블로그(https://devocean.sk.com/blog/techBoardDetail.do?ID=163522)에서 소개했던 playground의 예제를 분석하여 OPA를 통한 실질적인 구현에서 각 데이터들을 설계하고 사용하는 방법에 대한 이해도를 높히도록 한다.

Playground에서 제공하는 예제는 다음과 같다.

목차

Role-based Access Control

Data

{
    "user_roles": {
        "alice": [
            "admin"
        ],
        "bob": [
            "employee",
            "billing"
        ],
        "eve": [
            "customer"
        ]
    },
    "role_grants": {
        "customer": [
            {
                "action": "read",
                "type": "dog"
            },
            {
                "action": "read",
                "type": "cat"
            },
            {
                "action": "adopt",
                "type": "dog"
            },
            {
                "action": "adopt",
                "type": "cat"
            }
        ],
        "employee": [
            {
                "action": "read",
                "type": "dog"
            },
            {
                "action": "read",
                "type": "cat"
            },
            {
                "action": "update",
                "type": "dog"
            },
            {
                "action": "update",
                "type": "cat"
            }
        ],
        "billing": [
            {
                "action": "read",
                "type": "finance"
            },
            {
                "action": "update",
                "type": "finance"
            }
        ]
    }
}

정책

package app.rbac

import future.keywords.in

default allow = false

allow {
	user_is_admin
}

allow {
	some grant
	user_is_granted[grant]

	input.action == grant.action
	input.type == grant.type
}

user_is_admin {
	"admin" in data.user_roles[input.user]
}

user_is_granted[grant] {
	some role in data.user_roles[input.user]
	some grant in data.role_grants[role]
}

Access Control

Envoy