spakky-policy
spakky-policy는 YAML, TOML, JSON policy document를 typed canonical model로 로드합니다.spakky-auth의 RBAC, PBAC, ABAC-style 인가 규칙을 provider contribution으로 평가합니다.
설치
pip install spakky-auth spakky-policy spakky-fastapi
사용법
SPAKKY_POLICY_DOCUMENT_PATH가 YAML, TOML, JSON 문서를 가리키면 플러그인이 해당 문서를
DI-managed PolicyDocument로 로드합니다. 경로를 설정하지 않으면 비어 있는 policy document를
등록해 인가 요청을 안전하게 거부합니다.
from fastapi import FastAPI
from spakky.auth import protected, require_policy
from spakky.core.application.application import SpakkyApplication
from spakky.core.application.application_context import ApplicationContext
from spakky.plugins.fastapi.routes import get
from spakky.plugins.fastapi.stereotypes.api_controller import ApiController
import spakky.auth
import spakky.plugins.fastapi
import spakky.plugins.policy
@ApiController("/articles")
class ArticleController:
@get("/{article_id}")
@require_policy(resource="article:1", action="article:read")
@protected
def read(self, article_id: str) -> dict[str, str]:
return {"id": article_id}
app = (
SpakkyApplication(ApplicationContext())
.load_plugins(
include={
spakky.auth.PLUGIN_NAME,
spakky.plugins.fastapi.PLUGIN_NAME,
spakky.plugins.policy.PLUGIN_NAME,
}
)
.add(ArticleController)
.start()
)
api = app.container.get(FastAPI)
Policy 의미
- 명시적 deny statement는 matching allow statement보다 우선합니다.
- matching allow statement가 없으면 default deny evidence를 반환합니다.
- condition은
all,any,notcomposition과equals,not_equals,in,contains,existsatomic operator를 지원합니다. - resource, action, tenant ref는 decorator metadata,
AuthContext, resolver output, 또는 provider-neutralAuthorizationRequest에서 온 canonical string입니다. - named policy가 OR/ANY 사용자 표면입니다. MCP/tool authorization, generic policy API, policy UI, authorized data filtering은 이 패키지 범위 밖입니다.
Policy 문서 구조
정책 문서는 YAML, TOML, JSON을 지원하며 다음 top-level collection을 typed canonical model로 변환합니다.
| 필드 | 의미 |
|---|---|
version |
policy document schema version 문자열 |
metadata |
name, optional description, labels |
subjects |
subject ref와 역할, scope, permission, claim, tenant binding |
resources |
resource ref와 optional tenant |
actions |
action ref |
permissions |
resource/action 묶음을 가진 named permission |
roles |
permission 묶음을 가진 named role |
scopes |
permission 묶음을 가진 named scope |
policies |
statement 목록을 가진 named policy |
conditions |
재사용 가능한 atomic/composite condition |
최소 YAML 예:
version: "1"
metadata:
name: article-policy
subjects:
- ref: user:alice
roles: [role:editor]
resources:
- ref: article:1
actions:
- ref: article:read
permissions:
- ref: permission:article-read
resources: [article:1]
actions: [article:read]
roles:
- ref: role:editor
permissions: [permission:article-read]
policies:
- ref: policy:read-article
statements:
- ref: allow-editor
effect: allow
roles: [role:editor]
resources: [article:1]
actions: [article:read]
플러그인 등록
Base plugin entry point는 SpakkyPolicyConfig, spakky_policy_document, SpakkyPolicyAuthProvider를 등록하고 IAuthorizationPolicyEvaluator, IPermissionChecker, IRoleChecker, IScopeChecker를 provider에 binding합니다. Auth feature contribution entry point는 spakky.contributions.spakky.auth group에 policy/permission/role/scope capability metadata를 등록합니다.
개발 검증
패키지 단위 검증은 해당 패키지 디렉토리에서 실행합니다.
uv run ruff format .
uv run ruff check .
uv run pyrefly check
uv run pytest
pytest는 각 패키지 pyproject.toml의 coverage 설정을 사용합니다.
라이선스
MIT
Metadata
Release files for spakky-policy 8.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| spakky_policy-8.1.0.tar.gz | 10.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| spakky_policy-8.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.7 kB
Release files / spakky_policy-8.1.0.tar.gz
| Download URL | spakky_policy-8.1.0.tar.gz |
|---|---|
| Size | 10.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e3a43edf207e58e73e5dc5eec36735c7e69f9ddc32d13fa83b7eb0a6587e52f9
|
|
BLAKE2b-256 checksum How to use checksums |
ca98ffb8e58b31f83c7f09a5e736dc0ac7f9f3ee369b7264108561bbefe0669c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.
Transparency logRelease files / spakky_policy-8.1.0-py3-none-any.whl
| Download URL | spakky_policy-8.1.0-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
66ac68050fdae0b3a856633347bc6d1f99281fd906a24152d270b478675edae4
|
|
BLAKE2b-256 checksum How to use checksums |
b719d1f530e826d54d3ee01117ed69664ff2a9a46c3ed796e50b0d915ff3e3c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.
Transparency log