
Kit을 위한 유연하고 구성 가능한 권한 부여 프레임워크 (Action Policy에서 영감을 받음)
Ruby의 Action Policy에서 영감을 받은, Kit을 위한 유연하고 합성 가능한 권한 부여 프레임워크입니다.
[TOC]
| 파일 | 설명 |
|---|---|
.editorconfig | 편집기 서식 구성 |
.gitignore | 빌드 아티팩트 및 의존성에 대한 Git 무시 규칙 |
.tool-versions | asdf 도구 버전 (Zig, Kit) |
LICENSE | MIT 라이선스 파일 |
README.md | 이 파일 |
examples/blog-policy.kit | 블로그 권한 부여 예제 |
kit.toml | 메타데이터, 작업, 린트 구성을 포함한 패키지 매니페스트 |
src/core.kit | 핵심 권한 부여 헬퍼 |
src/error.kit | 권한 부여 오류, 결과 유형 및 실패 이유 |
src/main.kit | 패키지 루트 모듈 |
src/scope.kit | 범위, 조건자 및 페이지네이션 헬퍼 |
tests/policy.test.kit | 종단 간 정책 동작 테스트 |
tests/types.test.kit |
Kit 패키지 의존성 없음.
kit add gitlab.com/kit-lang/packages/kit-policy.git
import Kit.Policy.Core as PolicyCore
import Kit.Policy.Error as PolicyError
import Kit.Policy.Scope as PolicyScope
type Post = {id: Int, author-id: Int, published?: Bool, title: String}
type User = {id: Int, admin?: Bool}
type AuthContext = {user: User}
post-policy = fn(post, ctx, action) =>
if ctx.user.admin? then
PolicyCore.allow
else
match PolicyCore.resolve-alias action
| :show -> PolicyCore.allow-if post.published?
| :update -> PolicyCore.allow-if (ctx.user.id == post.author-id)
| :destroy -> PolicyCore.allow-if (ctx.user.id == post.author-id)
| _ -> PolicyCore.no-rule action
post-scope = fn(posts, ctx) =>
if ctx.user.admin? then
posts
else
posts |>> List.filter (fn(post) => post.published?)
main = fn =>
user = {id: 1, admin?: false}
ctx = {user: user}
post = {id: 1, author-id: 1, published?: true, title: "Hello"}
posts = [post]
if PolicyCore.can-with? post-policy post ctx :update then
println "Can update post"
else
println "Cannot update post"
visible-posts = PolicyScope.scope-with post-scope posts ctx
page = PolicyScope.paginate 1 10 visible-posts
info = PolicyScope.pagination-info 1 10 visible-posts
println "Visible posts: ${page}"
println "Pages: ${info.pages}"
err = PolicyError.not-authorized "Post" :update "not the author"
println (PolicyError.message err)
main
Result Bool PolicyError를 반환하는 정책 함수를 위한 핵심 헬퍼입니다.
PolicyCore.can-with? policy resource context action
PolicyCore.may-with? policy resource context action
PolicyCore.allow
PolicyCore.deny
PolicyCore.allow-if condition
PolicyCore.deny-if condition
PolicyCore.no-rule action
PolicyCore.allow-or-deny condition resource-name reason action
사전 검사 헬퍼는 Option Bool을 반환합니다: Some true는 허용, Some false는 거부, None은 주 규칙으로 계속 진행합니다.
PolicyCore.admin-bypass is-admin? ctx
PolicyCore.owner-check is-owner? resource ctx
PolicyCore.first-pre-check [check1, check2, check3]
액션 헬퍼는 공통 액션 그룹과 별칭을 제공합니다.
PolicyCore.crud-actions
PolicyCore.read-actions
PolicyCore.write-actions
PolicyCore.read-action? action
PolicyCore.write-action? action
PolicyCore.resolve-alias :new # :create
PolicyCore.resolve-alias :edit # :update
PolicyCore.resolve-alias :delete # :destroy
PolicyCore.resolve-alias :view # :show
정책 합성 헬퍼는 여러 권한 부여 결과를 결합합니다.
PolicyCore.all-allowed? [result1, result2, result3]
PolicyCore.any-allowed? [result1, result2, result3]
범위 헬퍼는 호출자에게 데이터를 반환하기 전에 컬렉션을 필터링합니다.
PolicyScope.scope-with scope-fn items ctx
PolicyScope.filter-by predicate items
PolicyScope.is-owned-by? get-owner-id get-user-id item ctx
PolicyScope.is-published? get-published item
PolicyScope.is-in-state? get-state target-state item
PolicyScope.is-admin-or? check-admin fallback-check ctx item
조건자 결합기는 재사용 가능한 범위 검사를 구축하는 데 유용합니다.
PolicyScope.both? pred1 pred2 item
PolicyScope.either? pred1 pred2 item
PolicyScope.not-matching? pred item
페이지네이션 헬퍼는 1부터 인덱싱됩니다.
page1 = PolicyScope.paginate 1 10 items
pages = PolicyScope.total-pages 10 items
info = PolicyScope.pagination-info 1 10 items
권한 부여 실패를 위한 오류 및 결과 유형입니다.
type PolicyError =
| NotAuthorized {resource: String, action: Keyword, reason: String}
| RuleNotFound {action: Keyword}
| ContextMissing {field: String}
| PolicyNotFound {resource-type: String}
| CustomError String
type FailureReason = FailureReason {
policy: String,
action: Keyword,
details: String
}
type AuthResult =
| Allowed
| Denied String
헬퍼 함수는 모듈에서 내보내지므로 PolicyError로 가져오면 모듈 함수로 호출됩니다.
PolicyError.not-authorized resource action reason
PolicyError.rule-not-found action
PolicyError.context-missing field
PolicyError.policy-not-found resource-type
PolicyError.custom message
PolicyError.message err
PolicyError.kind err
PolicyError.is-not-authorized? err
PolicyError.is-rule-not-found? err
PolicyError.new policy action
PolicyError.with-details policy action details
PolicyError.policy reason
PolicyError.action reason
PolicyError.details reason
PolicyError.format reason
PolicyError.allowed
PolicyError.denied reason
PolicyError.is-allowed? result
PolicyError.is-denied? result
PolicyError.reason result
PolicyError.to-result resource-name action result
Result Bool PolicyError를 반환합니다.:index, :show, :create, :update, :destroy와 같은 키워드를 사용합니다.인터프리터로 블로그 정책 예제를 실행합니다:
kit run examples/blog-policy.kit
예제를 네이티브 바이너리로 컴파일합니다:
kit build examples/blog-policy.kit && ./blog-policy
테스트 스위트 실행:
kit test
커버리지와 함께 테스트 스위트 실행:
kit test --coverage
표준 개발 워크플로우 실행(포맷, 검사, 테스트):
kit dev
다음을 수행합니다:
src/의 소스 파일 포맷 및 검사examples/의 예제 타입 검사tests/의 테스트를 커버리지로 실행예제에 대한 패리티 검사 실행:
kit parity --failures-only
문서 주석에서 API 문서 생성:
kit doc
참고: 문서 주석(##)이 있는 Kit 소스는 docs/*.html에 HTML 문서를 생성합니다.
생성된 파일, 캐시 및 빌드 아티팩트 제거:
kit task clean
참고: kit.toml에 정의되어 있습니다.
개발을 위해 이 패키지를 로컬에 설치하려면:
kit install
이 패키지는 ~/.kit/packages/@kit/policy/에 설치되어 다른 프로젝트에서 Kit.Policy로 가져올 수 있습니다.
이 패키지는 MIT 라이선스 하에 제공됩니다 - 자세한 내용은 LICENSE를 참조하세요.
| 정책 유형 및 헬퍼 테스트 |