Rust SDK는 Rust 1.75 이상이 필요합니다. tokio와 reqwest(rustls)를 기반으로 한 비동기 구성을 제공합니다. blocking 기능 플래그를 통해 아래 예제에서 사용하는 동기식 블로킹 클라이언트가 추가됩니다. 크레이트: crates.io의 speedle 0.2.0. 참조 문서: speedle-sdk/rust.
예제에서는 SDK 개요에서 설명한 정책을 확인합니다.
의존성 추가
새 패키지를 생성하고 의존성을 추가합니다:
cargo new speedle-example
cd speedle-example
cargo add speedle@0.2.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::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(())
}
실행합니다:
cargo run출력:
alice get /docs/public: allowed=true
alice delete /docs/public: allowed=false reason=NoApplicablePoliciesSpeedle 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를 사용하면 토큰이 셸 기록이나 화면에 노출되지 않습니다:
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토큰은 서버 측 비밀 값입니다. 브라우저, 모바일 앱 또는 데스크톱 클라이언트에 절대 배포하지 마십시오.
오류 처리
거부된 요청은 오류가 아닙니다. 위의 delete 호출과 같이 is_allowed는 false를 반환하고, check는 allowed가 false이며 이유를 포함하는 결정을 반환합니다. 기본 구성에서 호출이 결정을 반환할 수 없는 경우 Err(speedle::Error)를 반환합니다. 예제에서는 오류를 ?로 main에 전달하고 표준 오류로 Speedle error: <message>를 출력하여 종료 상태 1로 종료합니다.