Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
kit-policy — Гибкая, компонуемая структура авторизации для Kit (вдохновленная Action Policy) | Kitploit
Инструменты/GitLabGitLab/kit-lang/packages/kit-policy
Аутентификация и авторизацияУтилиты и фреймворки
GitLabkit-lang/packages/kit-policy

kit-policy

Гибкая, компонуемая структура авторизации для Kit (вдохновленная Action Policy)

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
253 месяцев назадЕщё не проверено
# kit-policy

Гибкая, компонуемая система авторизации для Kit, вдохновлённая [Action Policy](https://actionpolicy.evilmartians.io/) из Ruby.

---

[TOC]

---

## Файлы

| Файл | Описание |
|------|----------|
| [`.editorconfig`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/.editorconfig) | Настройки форматирования редактора |
| [`.gitignore`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/.gitignore) | Правила игнорирования Git для артефактов сборки и зависимостей |
| [`.tool-versions`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/.tool-versions) | Версии инструментов asdf (Zig, Kit) |
| [`LICENSE`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/LICENSE) | Файл лицензии MIT |
| [`README.md`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/README.md) | Этот файл |
| [`examples/blog-policy.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/examples/blog-policy.kit) | Пример авторизации блога |
| [`kit.toml`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/kit.toml) | Манифест пакета с метаданными, задачами и конфигурацией линтинга |
| [`src/core.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/src/core.kit) | Базовые хелперы авторизации |
| [`src/error.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/src/error.kit) | Ошибки авторизации, типы результатов и причины отказов |
| [`src/main.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/src/main.kit) | Корневой модуль пакета |
| [`src/scope.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/src/scope.kit) | Хелперы для области видимости, предикатов и пагинации |
| [`tests/policy.test.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/tests/policy.test.kit) | Сквозные тесты поведения политик |
| [`tests/types.test.kit`](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/tests/types.test.kit) | Тесты типов и хелперов политик |

## Зависимости

_Нет зависимостей от пакетов Kit._

## Установка

```console
kit add gitlab.com/kit-lang/packages/kit-policy.git
```

## Использование

```kit
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
```

## Обзор API

### Policy.Core

Базовые хелперы для функций политик, возвращающих `Result Bool PolicyError`.

```kit
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` передаёт управление основному правилу.

```kit
PolicyCore.admin-bypass is-admin? ctx
PolicyCore.owner-check is-owner? resource ctx
PolicyCore.first-pre-check [check1, check2, check3]
```

Хелперы действий предоставляют распространённые группы действий и псевдонимы.

```kit
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
```

Хелперы композиции политик объединяют несколько результатов авторизации.

```kit
PolicyCore.all-allowed? [result1, result2, result3]
PolicyCore.any-allowed? [result1, result2, result3]
```

### Policy.Scope

Хелперы области видимости фильтруют коллекции перед возвратом данных вызывающему коду.

```kit
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
```

Комбинаторы предикатов полезны для создания переиспользуемых проверок области видимости.

```kit
PolicyScope.both? pred1 pred2 item
PolicyScope.either? pred1 pred2 item
PolicyScope.not-matching? pred item
```

Хелперы пагинации индексируются с 1.

```kit
page1 = PolicyScope.paginate 1 10 items
pages = PolicyScope.total-pages 10 items
info = PolicyScope.pagination-info 1 10 items
```

### Policy.Error

Типы ошибок и результатов для сбоев авторизации.

```kit
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` они вызываются как функции модуля.

```kit
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.

## Разработка

### Запуск примеров

Запустите пример политики блога через интерпретатор:

```console
kit run examples/blog-policy.kit
```

Скомпилируйте пример в нативный бинарник:

```console
kit build examples/blog-policy.kit && ./blog-policy
```

### Запуск тестов

Запустите набор тестов:

```console
kit test
```

Запустите тесты с покрытием:

```console
kit test --coverage
```

### Запуск kit dev

Запустите стандартный рабочий процесс разработки (форматирование, проверка, тестирование):

```console
kit dev
```

Это выполнит:
1. Форматирование и проверку исходных файлов в `src/`
2. Проверку типов в примерах из `examples/`
3. Запуск тестов из `tests/` с покрытием

### Проверка соответствия интерпретатора и компилятора

Запустите проверки на соответствие для примеров:

```console
kit parity --failures-only
```

### Генерация документации

Сгенерируйте документацию по API из комментариев:

```console
kit doc
```

**Примечание**: Исходники Kit с комментариями (`##`) создадут HTML-документы в `docs/*.html`.

### Очистка артефактов сборки

Удалите сгенерированные файлы, кеши и артефакты сборки:

```console
kit task clean
```

**Примечание**: Определено в [kit.toml](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/kit.toml).

## Локальная установка

Для локальной установки этого пакета в целях разработки:

```console
kit install
```

Это установит пакет в `~/.kit/packages/@kit/policy/`, сделав его доступным для импорта как `Kit.Policy` в других проектах.

## Лицензия

Этот пакет выпущен под лицензией MIT — см. файл [LICENSE](https://gitlab.com/kit-lang/packages/kit-policy/-/blob/main/LICENSE) для подробностей.
Скачать инструмент