Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Токены разрешений

Типы-токены хорошо подходят как доказательство проверенного разрешения.

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

mod admin {
    pub struct AdminToken(());

    pub fn get_admin(password: &str) -> Option<AdminToken> {
        if password == "Password123" { Some(AdminToken(())) } else { None }
    }
}

// Не нужно проверять наличие прав, потому что
// аргумент AdminToken равнозначен такой проверке.
pub fn add_moderator(_: &admin::AdminToken, user: &str) {}

fn main() {
    if let Some(token) = admin::get_admin("Password123") {
        add_moderator(&token, "CoolUser");
    } else {
        eprintln!("Incorrect password! Could not prove privileges.")
    }
}
  • В этом примере моделируется получение прав администратора в чат-клиенте по паролю и выдача пользователю звания модератора после получения этих прав. Тип AdminToken выступает в роли «доказательства корректных прав пользователя».

    Пароль запрашивается в коде; если пароль верный, мы получаем AdminToken, чтобы выполнять действия администратора в конкретной среде (здесь — в чат-клиенте).

    После получения прав можно вызвать функцию add_moderator.

    Эту функцию нельзя вызвать без типа-токена, поэтому, если её вообще можно вызвать, мы можем считать, что права есть.

  • Продемонстрируйте: попробуйте снова создать AdminToken в main, чтобы повторить, что основа полезных токенов — запрет на их произвольное создание.