Rust SDK 需要 Rust 1.75 或更高版本,基于 tokio 和 reqwest(rustls)实现异步调用;下面使用的阻塞客户端由 blocking 特性提供。crate:crates.io 上的 speedle 0.1.0。参考文档:speedle-sdk/rust。
示例检查的策略见 SDK 概览。
添加依赖
新建包并添加依赖:
cargo new speedle-example
cd speedle-example
cargo add speedle@0.1.0 --features blocking调用本地 Speedle
按 SDK 概览中的说明启动 Speedle 并创建示例策略。将 src/main.rs 替换为:
use speedle::blocking::Client;
use speedle::{Auth, Backend};
fn main() {
if let Err(e) = run() {
eprintln!("Speedle error: {e}");
std::process::exit(1);
}
}
fn run() -> Result<(), speedle::Error> {
let speedle = Client::builder(Backend::SpeedlePlus, "http://localhost:6734", Auth::none(), "docs").build()?;
let allowed = speedle.is_allowed(&"alice".into(), "get", "/docs/public", &[])?;
println!("alice get /docs/public: allowed={allowed}");
let d = speedle.check(&"alice".into(), "delete", "/docs/public", &[])?;
println!("alice delete /docs/public: allowed={} reason={:?}", d.allowed, d.reason);
Ok(())
}
运行:
cargo run输出:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePolicies调用 Speedle Cloud
Speedle Cloud 即将上线。
程序从 SPEEDLE_SERVICE 读取服务名,从 SPEEDLE_TOKEN 读取该服务的令牌。SPEEDLE_ENDPOINT 可覆盖默认端点 https://cloud.speedle.io。将 src/main.rs 替换为:
use std::env;
use speedle::blocking::Client;
use speedle::{Auth, Backend};
fn main() {
if let Err(e) = run() {
eprintln!("Speedle error: {e}");
std::process::exit(1);
}
}
fn run() -> Result<(), speedle::Error> {
let endpoint = env::var("SPEEDLE_ENDPOINT").unwrap_or_else(|_| "https://cloud.speedle.io".to_string());
let token = env::var("SPEEDLE_TOKEN").unwrap_or_default();
let service = env::var("SPEEDLE_SERVICE").unwrap_or_default();
let speedle = Client::builder(Backend::SpeedleCloud, &endpoint, Auth::bearer(token), service).build()?;
let allowed = speedle.is_allowed(&"alice".into(), "get", "/docs/public", &[])?;
println!("alice get /docs/public: allowed={allowed}");
let d = speedle.check(&"alice".into(), "delete", "/docs/public", &[])?;
println!("alice delete /docs/public: allowed={} reason={:?}", d.allowed, d.reason);
Ok(())
}
设置环境变量后运行。read -rs 不会把令牌写入 shell 历史,也不会显示在屏幕上:
export SPEEDLE_SERVICE=docs
read -rs SPEEDLE_TOKEN && export SPEEDLE_TOKEN
cargo run服务中已有示例策略时,输出为:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePolicies令牌是服务端密钥,切勿放进浏览器、移动应用或桌面客户端。
错误处理
请求被拒绝不是错误:is_allowed 返回 false,check 返回 allowed 为 false 的结果及原因,如上文的 delete 调用。在默认设置下,调用无法得出授权结果时,调用返回 Err(speedle::Error)。示例用 ? 把错误交给 main,向标准错误输出 Speedle error: <消息>,并以状态码 1 退出。