El SDK de Rust requiere Rust 1.75 o posterior. Es asíncrono sobre tokio y reqwest (rustls); la característica blocking añade el cliente bloqueante utilizado a continuación. Crate: speedle 0.2.0 en crates.io. Referencia: speedle-sdk/rust.
Los ejemplos comprueban la política descrita en la descripción general de los SDK.
Añadir la dependencia
En un nuevo paquete:
cargo new speedle-example
cd speedle-example
cargo add speedle@0.2.0 --features blockingLlamar a un Speedle local
Inicie Speedle y cree la política de ejemplo como se describe en la descripción general de los SDK. Sustituya src/main.rs por:
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::Speedle, "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(())
}
Ejecución:
cargo runSalida:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePoliciesLlamar a Speedle Cloud
Speedle Cloud estará disponible próximamente.
El programa lee el nombre del servicio desde SPEEDLE_SERVICE y el token del servicio desde SPEEDLE_TOKEN. SPEEDLE_ENDPOINT anula el endpoint predeterminado https://cloud.speedle.io. Sustituya src/main.rs por:
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(())
}
Configure las variables de entorno y ejecútelo. read -rs evita que el token quede registrado en el historial de la terminal o en pantalla:
export SPEEDLE_SERVICE=docs
read -rs SPEEDLE_TOKEN && export SPEEDLE_TOKEN
cargo runSalida, cuando el servicio cuenta con la política de ejemplo:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePoliciesEl token es un secreto del lado del servidor. Nunca lo distribuya a navegadores, aplicaciones móviles o clientes de escritorio.
Gestión de errores
Una solicitud denegada no constituye un error: is_allowed devuelve false, y check devuelve una decisión con allowed en false y el motivo, tal como se muestra en la llamada a delete anterior. Con la configuración predeterminada, cuando una llamada no puede devolver una decisión, devuelve Err(speedle::Error). Los ejemplos propagan el error a main con ?, imprimen Speedle error: <mensaje> en la salida de error estándar y finalizan con el código de salida 1.