快速入门指南
English | 中文文档
几分钟内上手 sa-token-rust。本指南涵盖安装、初始化和基本用法。
简化使用方式(推荐)
只需添加一个依赖到你的 Cargo.toml:
toml
[dependencies]
sa-token-plugin-axum = "0.1.14" # 默认:内存存储
tokio = { version = "1", features = ["full"] }
axum = "0.8"一行导入:
rust
use sa_token_plugin_axum::*; // 你需要的一切!
// 现在你可以直接使用:
// - SaTokenManager, StpUtil
// - MemoryStorage, RedisStorage(通过 features)
// - 所有宏:#[sa_check_login], #[sa_check_permission]
// - JWT, OAuth2, WebSocket, 在线用户等选择存储后端
toml
# Redis 存储
sa-token-plugin-axum = { version = "0.1.14", features = ["redis"] }
# 多个存储后端
sa-token-plugin-axum = { version = "0.1.14", features = ["memory", "redis"] }
# 所有存储后端
sa-token-plugin-axum = { version = "0.1.14", features = ["full"] }可用的 features:
memory(默认):内存存储redis:Redis 存储database:数据库存储full:所有存储后端
可用的插件(0.1.14):
sa-token-plugin-axum— Axum(默认axum-08)sa-token-plugin-actix-web— Actix-web 门面(默认v4;v5仅占位)sa-token-plugin-poem— Poem(默认poem-03)sa-token-plugin-rocket— Rocket 门面(默认v05)sa-token-plugin-warp— Warp(默认warp-03)sa-token-plugin-salvo— Salvo 门面(默认v079)sa-token-plugin-tide— Tide(默认tide-017)sa-token-plugin-gotham— Gotham 门面(默认v074)sa-token-plugin-ntex— Ntex 门面(默认v212)
如何选择 crate
- 一体化(A 组) — Axum、Warp、Poem、Tide:一个依赖,绑定 feature 默认开启。
- 门面(B 组) — Actix-web、Rocket、Salvo、Gotham、Ntex:一个依赖,通过 Cargo features 默认选对应当前支持的大版本(
v4、v05…)。生产环境 勿 单独依赖 Actixv5(HTTP 未接好)。
更多 Cargo.toml 示例
toml
sa-token-plugin-actix-web = { version = "0.1.14", features = ["redis"] }
sa-token-plugin-rocket = "0.1.14"
sa-token-plugin-salvo = "0.1.14"完整对照表见仓库根目录 README.md。
传统使用方式(高级)
如果你喜欢细粒度控制:
toml
[dependencies]
sa-token-core = "0.1.14"
sa-token-storage-memory = "0.1.14"
sa-token-plugin-axum = "0.1.14"
tokio = { version = "1", features = ["full"] }
axum = "0.8"初始化 sa-token
方式 A: 使用内存存储(开发环境)
rust
use sa_token_plugin_axum::*;
use std::sync::Arc;
#[tokio::main]
async fn main() {
// 创建状态(StpUtil 会自动初始化)
let state = SaTokenState::builder()
.storage(Arc::new(MemoryStorage::new()))
.token_name("Authorization")
.timeout(86400) // 24 小时
.build();
// StpUtil 已就绪,可以直接使用!
}方式 B: 使用 Redis 存储(生产环境)
方法 1: 连接字符串
rust
use sa_token_plugin_axum::*;
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let storage = RedisStorage::new(
"redis://:password@localhost:6379/0",
"sa-token:"
).await?;
let state = SaTokenState::builder()
.storage(Arc::new(storage))
.timeout(86400)
.build();
Ok(())
}方法 2: RedisConfig 结构体(推荐配置文件读取)
rust
use sa_token_storage_redis::{RedisStorage, RedisConfig};
use sa_token_plugin_axum::SaTokenState;
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = RedisConfig {
host: "localhost".to_string(),
port: 6379,
password: Some("password".to_string()),
database: 0,
pool_size: 10,
};
let storage = RedisStorage::from_config(config, "sa-token:").await?;
let state = SaTokenState::builder()
.storage(Arc::new(storage))
.timeout(86400)
.build();
Ok(())
}方法 3: Builder 构建器(最灵活)
rust
use sa_token_storage_redis::RedisStorage;
use sa_token_plugin_axum::SaTokenState;
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let storage = RedisStorage::builder()
.host("localhost")
.port(6379)
.password("password")
.database(0)
.key_prefix("sa-token:")
.build()
.await?;
let state = SaTokenState::builder()
.storage(Arc::new(storage))
.timeout(86400)
.build();
Ok(())
}用户登录
rust
use sa_token_core::StpUtil;
// 用户登录
let token = StpUtil::login("user_id_10001").await?;
println!("Token: {}", token.as_str());
// 设置权限和角色
StpUtil::set_permissions(
"user_id_10001",
vec!["user:list".to_string(), "user:add".to_string()]
).await?;
StpUtil::set_roles(
"user_id_10001",
vec!["admin".to_string()]
).await?;检查认证(Axum 示例)
rust
use axum::{Router, routing::get};
use sa_token_plugin_axum::{SaTokenMiddleware, LoginIdExtractor};
async fn user_info(LoginIdExtractor(login_id): LoginIdExtractor) -> String {
format!("当前用户: {}", login_id)
}
async fn admin_panel(login_id: LoginIdExtractor) -> String {
if !StpUtil::has_permission(&login_id.0, "admin:panel").await {
return "无权限".to_string();
}
format!("欢迎管理员: {}", login_id.0)
}
let app = Router::new()
.route("/user/info", get(user_info))
.route("/admin/panel", get(admin_panel))
.layer(SaTokenMiddleware::new(state));使用过程宏
rust
use sa_token_macro::*;
#[sa_check_login]
async fn protected_route() -> &'static str {
"此路由需要登录"
}
#[sa_check_permission("user:delete")]
async fn delete_user(user_id: String) -> &'static str {
"用户已删除"
}
#[sa_check_role("admin")]
async fn admin_only() -> &'static str {
"仅管理员可见内容"
}Token 配置
rust
let state = SaTokenState::builder()
.storage(Arc::new(MemoryStorage::new()))
.token_name("X-Token") // 自定义 Token 名称
.timeout(7200) // Token 超时(秒)
.active_timeout(1800) // 活动超时(秒)
.auto_renew(true) // 访问时自动续签 Token
.enable_nonce(true) // 启用防重放攻击保护
.nonce_timeout(300) // Nonce 有效期(秒)
.enable_refresh_token(true) // 启用 Refresh Token
.refresh_token_timeout(604800) // Refresh Token 有效期(默认 7 天)
.jwt_secret_key("your-secret") // JWT 签名密钥(仅 JWT 风格)
.jwt_algorithm("HS256") // JWT 算法
.jwt_issuer("my-app") // JWT 签发者声明
.jwt_audience("web-users") // JWT 受众声明
.build();auto_renew:启用后,每次访问(如中间件验证)时 Token 自动续签。续签时长由 active_timeout(> 0 时)或 timeout 决定。
架构概览
sa-token-rust/
├── sa-token-core/ # 核心库(Token、Session、Manager)
│ ├── token/ # Token 管理
│ │ ├── generator.rs # Token 生成(UUID、Random、JWT、Hash、Timestamp、Tik)
│ │ ├── validator.rs # Token 验证
│ │ ├── jwt.rs # JWT 实现(HS256/384/512、RS256/384/512、ES256/384)
│ │ └── mod.rs # Token 类型(TokenValue、TokenInfo)
│ ├── session/ # Session 管理
│ ├── permission/ # 权限和角色检查
│ ├── event/ # 事件监听系统
│ ├── nonce.rs # Nonce 管理器(防重放攻击)
│ ├── refresh.rs # Refresh Token 管理器
│ ├── oauth2.rs # OAuth2 授权码模式
│ ├── ws.rs # WebSocket 认证
│ ├── online.rs # 在线用户管理和实时推送
│ ├── distributed.rs # 分布式 Session 管理
│ ├── sso.rs # SSO 单点登录(Server、Client、Ticket)
│ ├── router.rs # 路径鉴权路由器
│ ├── manager.rs # SaTokenManager(核心管理器)
│ ├── config.rs # 配置和构建器
│ └── util.rs # StpUtil(工具类)
├── sa-token-adapter/ # 适配器接口(Storage、Request/Response)
├── sa-token-macro/ # 过程宏(#[sa_check_login] 等)
├── sa-token-storage-memory/ # 内存存储实现
├── sa-token-storage-redis/ # Redis 存储实现
├── sa-token-storage-database/ # 数据库存储实现
├── sa-token-plugin-axum/ # Axum 框架集成(v08 绑定)
├── sa-token-plugin-actix-web/ # Actix-web 门面 → v4/v5 绑定
│ ├── sa-token-plugin-actix-web-core/ # 共享 Actix-web 核心(状态、适配器、错误)
│ ├── sa-token-plugin-actix-web-v4/ # Actix-web 4.x 绑定
│ └── sa-token-plugin-actix-web-v5/ # Actix-web 5.x 绑定(占位)
├── sa-token-plugin-poem/ # Poem 框架集成
├── sa-token-plugin-rocket/ # Rocket 门面 → v05 绑定
│ ├── sa-token-plugin-rocket-core/ # 共享 Rocket 核心
│ └── sa-token-plugin-rocket-v05/ # Rocket 0.5.x 绑定
├── sa-token-plugin-warp/ # Warp 框架集成
├── sa-token-plugin-salvo/ # Salvo 门面 → v079 绑定
│ ├── sa-token-plugin-salvo-core/ # 共享 Salvo 核心
│ └── sa-token-plugin-salvo-v079/ # Salvo 0.79.x 绑定
├── sa-token-plugin-tide/ # Tide 框架集成
├── sa-token-plugin-gotham/ # Gotham 门面 → v074 绑定
│ ├── sa-token-plugin-gotham-core/ # 共享 Gotham 核心
│ └── sa-token-plugin-gotham-v074/ # Gotham 0.7.x 绑定
├── sa-token-plugin-ntex/ # Ntex 门面 → v212 绑定
│ ├── sa-token-plugin-ntex-core/ # 共享 Ntex 核心
│ └── sa-token-plugin-ntex-v212/ # Ntex 2.x 绑定
└── examples/ # 示例项目