3.6.1 权限令牌

01-权限令牌 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/idiomatic/leveraging-the-type-system/token-types/permission-tokens.html

3.6.1 权限令牌

令牌类型很适合作为已检查权限的证明。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 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 函数。

    没有令牌类型就无法调用该函数,因此只要能调用它,我们就可以假定拥有权限。

  • 演示:再次尝试在 main 中构造 AdminToken,重申有用令牌的基础是防止其被任意构造。

最后修改 August 11, 2026: 更新 (70a5af133)