Токены разрешений
Типы-токены хорошо подходят как доказательство проверенного разрешения.
// 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, чтобы повторить, что основа полезных токенов — запрет на их произвольное создание.