sa-token-rust
中文文档 | English
A lightweight, high-performance authentication and authorization framework for Rust, inspired by sa-token.
✨ Features
- 🚀 Multiple Web Framework Support: Axum, Actix-web, Poem, Rocket, Warp
- 🔐 Complete Authentication: Login, logout, token validation, session management
- 🛡️ Fine-grained Authorization: Permission and role-based access control
- 💾 Flexible Storage: Memory, Redis, and database storage backends
- 🎯 Easy to Use: Procedural macros and utility classes for simple integration
- ⚡ High Performance: Zero-copy design, async/await support
- 🔧 Highly Configurable: Token timeout, cookie options, custom token names
- 🎧 Event Listeners: Monitor login, logout, kick-out, and other authentication events
- 🔑 JWT Support: Full JWT (JSON Web Token) implementation with multiple algorithms
- 🔒 Security Features: Nonce for replay attack prevention, refresh token mechanism
- 🌐 OAuth2 Support: Complete OAuth2 authorization code flow implementation
📦 Architecture
sa-token-rust/
├── sa-token-core/ # Core library (Token, Session, Manager)
│ ├── token/ # Token management
│ │ ├── generator.rs # Token generation (UUID, Random, JWT, Hash, Timestamp, Tik)
│ │ ├── validator.rs # Token validation
│ │ ├── jwt.rs # JWT implementation (HS256/384/512, RS256/384/512, ES256/384)
│ │ └── mod.rs # Token types (TokenValue, TokenInfo)
│ ├── session/ # Session management
│ ├── permission/ # Permission and role checking
│ ├── event/ # Event listener system
│ │ └── mod.rs # Event bus, listeners (Login, Logout, KickOut, etc.)
│ ├── nonce.rs # Nonce manager (replay attack prevention)
│ ├── refresh.rs # Refresh token manager
│ ├── oauth2.rs # OAuth2 authorization code flow
│ ├── manager.rs # SaTokenManager (core manager)
│ ├── config.rs # Configuration and builder
│ └── util.rs # StpUtil (utility class)
├── sa-token-adapter/ # Adapter interfaces (Storage, Request/Response)
├── sa-token-macro/ # Procedural macros (#[sa_check_login], etc.)
├── sa-token-storage-memory/ # Memory storage implementation
├── sa-token-storage-redis/ # Redis storage implementation
├── sa-token-storage-database/ # Database storage implementation (placeholder)
├── sa-token-plugin-axum/ # Axum framework integration
├── sa-token-plugin-actix-web/ # Actix-web framework integration
├── sa-token-plugin-poem/ # Poem framework integration
├── sa-token-plugin-rocket/ # Rocket framework integration
├── sa-token-plugin-warp/ # Warp framework integration
├── examples/ # Example projects
│ ├── event_listener_example.rs # Event listener demo
│ ├── jwt_example.rs # JWT complete demo
│ ├── token_styles_example.rs # Token styles demo
│ ├── security_features_example.rs # Nonce & Refresh token demo
│ └── oauth2_example.rs # OAuth2 authorization flow demo
└── docs/ # Documentation
├── JWT_GUIDE.md / JWT_GUIDE_zh-CN.md
├── OAUTH2_GUIDE.md / OAUTH2_GUIDE_zh-CN.md
├── EVENT_LISTENER.md / EVENT_LISTENER_zh-CN.md
└── StpUtil.md / StpUtil_zh-CN.md
🎯 Core Components
1. sa-token-core
Core authentication and authorization logic:
SaTokenManager: Main manager for token and session operationsStpUtil: Utility class providing simplified API (Documentation)- Token generation, validation, and refresh
- Multiple token styles (UUID, Random, JWT, Hash, Timestamp, Tik)
- Session management
- Permission and role checking
- Event listening system (Documentation)
- JWT support with multiple algorithms (JWT Guide)
- Security features: Nonce (replay attack prevention), Refresh Token
- OAuth2 authorization code flow (OAuth2 Guide)
2. sa-token-adapter
Abstraction layer for framework integration:
SaStorage: Storage interface for tokens and sessionsSaRequest/SaResponse: Request/response abstraction
3. sa-token-macro
Procedural macros for annotation-style authentication:
#[sa_check_login]: Require login#[sa_check_permission("user:list")]: Check permission (Matching Rules)#[sa_check_role("admin")]: Check role#[sa_check_permissions_and(...)]: Check multiple permissions (AND)#[sa_check_permissions_or(...)]: Check multiple permissions (OR)#[sa_ignore]: Skip authentication
4. Web Framework Plugins
All plugins provide:
- State management with Builder pattern
- Dual middleware (basic + login-required)
- Three extractors (required, optional, LoginId)
- Request/Response adapters
- Token extraction from Header/Cookie/Query
- Bearer token support
🚀 Quick Start
1. Add Dependencies
[]
= "0.1"
= "0.1"
= "0.1" # Choose your framework
= { = "1", = ["full"] }
= "0.7"
2. Initialize sa-token
Option A: Using Memory Storage (Development)
use StpUtil;
use SaTokenState;
use MemoryStorage;
use Arc;
async
Option B: Using Redis Storage (Production)
Method 1: Redis URL (Recommended for simple scenarios)
use RedisStorage;
use SaTokenState;
use Arc;
async
Method 2: RedisConfig Structure (Recommended for configuration files)
use ;
use SaTokenState;
use Arc;
async
Method 3: Builder Pattern (Most flexible)
use RedisStorage;
use SaTokenState;
use Arc;
async
3. User Login
use StpUtil;
// User login
let token = login.await?;
println!;
// Set permissions and roles
set_permissions.await?;
set_roles.await?;
4. Check Authentication (Axum Example)
use ;
use ;
async
async
let app = new
.route
.route
.layer;
5. Using Procedural Macros
use *;
async
async
async
6. Event Listeners
Monitor authentication events like login, logout, and kick-out:
use async_trait;
use SaTokenListener;
use Arc;
// Create custom listener
;
// Register listener
register_listener.await;
// Or use built-in logging listener
use LoggingListener;
register_listener.await;
// Events are automatically triggered
let token = login.await?; // Triggers Login event
logout.await?; // Triggers Logout event
kick_out.await?; // Triggers KickOut event
For complete event listener documentation, see Event Listener Guide.
7. Token Styles
sa-token-rust supports multiple token generation styles to meet different scenarios:
use SaTokenConfig;
use TokenStyle;
let config = builder
.token_style // Choose your preferred style
.build_config;
Available Token Styles
| Style | Length | Example | Use Case |
|---|---|---|---|
| Uuid | 36 chars | 550e8400-e29b-41d4-a716-446655440000 |
Standard UUID format, universally recognized |
| SimpleUuid | 32 chars | 550e8400e29b41d4a716446655440000 |
UUID without hyphens, more compact |
| Random32 | 32 chars | a3f5c9d8e2b7f4a6c1e8d3b9f2a7c5e1 |
Random hex string, good security |
| Random64 | 64 chars | a3f5c9d8... |
Longer random string, higher security |
| Random128 | 128 chars | a3f5c9d8... |
Maximum random length, ultra-secure |
| Jwt | Variable | eyJhbGc... |
Self-contained token with claims (JWT Guide) |
| Hash ⭐ | 64 chars | 472c7dce... |
SHA256 hash with user info, traceable |
| Timestamp ⭐ | ~30 chars | 1760404107094_a8f4f17d88fcddb8 |
Includes timestamp, easy to track |
| Tik ⭐ | 8 chars | GIxYHHD5 |
Short and shareable, perfect for URLs |
⭐ = New in this version
Token Style Examples
// Uuid style (default)
.token_style
// Output: 550e8400-e29b-41d4-a716-446655440000
// Hash style - includes user information in hash
.token_style
// Output: 472c7dceee2b3079a1ae70746f43ba99b91636292ba7811b3bc8985a1148836f
// Timestamp style - includes millisecond timestamp
.token_style
// Output: 1760404107094_a8f4f17d88fcddb8
// Tik style - short 8-character token
.token_style
// Output: GIxYHHD5
// JWT style - self-contained token with claims
.token_style
.jwt_secret_key
// Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Choosing the Right Token Style
- Uuid/SimpleUuid: Standard choice, widely compatible
- Random32/64/128: When you need random tokens with specific length
- JWT: When you need self-contained tokens with embedded information
- Hash: When you need tokens that can be traced back to user info
- Timestamp: When you need to know when the token was created
- Tik: When you need short tokens for sharing (URLs, QR codes, etc.)
Run the example to see all token styles in action:
8. Security Features
Nonce (Replay Attack Prevention)
use NonceManager;
let nonce_manager = new; // 5 minutes TTL
// Generate nonce
let nonce = nonce_manager.generate;
// Validate and consume (one-time use)
nonce_manager.validate_and_consume.await?;
// Second use will fail (replay attack detected)
match nonce_manager.validate_and_consume.await
Refresh Token
use RefreshTokenManager;
let refresh_manager = new;
// Generate refresh token
let refresh_token = refresh_manager.generate;
refresh_manager.store.await?;
// Refresh access token when expired
let = refresh_manager
.refresh_access_token
.await?;
Run security features example:
9. OAuth2 Authorization
Complete OAuth2 authorization code flow implementation:
use ;
let oauth2 = new;
// Register OAuth2 client
let client = OAuth2Client ;
oauth2.register_client.await?;
// Generate authorization code
let auth_code = oauth2.generate_authorization_code;
oauth2.store_authorization_code.await?;
// Exchange code for token
let token = oauth2.exchange_code_for_token.await?;
// Verify access token
let token_info = oauth2.verify_access_token.await?;
// Refresh token
let new_token = oauth2.refresh_access_token.await?;
Run OAuth2 example:
📖 Full Event Listener Documentation
📚 Framework Integration Examples
Axum
use ;
use ;
let state = builder
.storage
.build;
let app = new
.route
.layer;
Actix-web
use ;
use ;
let state = builder
.storage
.build;
new
.bind?
.run
.await
Poem
use ;
use ;
let state = builder
.storage
.build;
let app = new
.at
.with;
new
.run
.await
Rocket
use ;
use ;
Warp
use Filter;
use ;
let state = builder
.storage
.build;
let routes = path
.and
.and
.map;
serve
.run
.await;
📖 Documentation
- StpUtil API Reference - Complete guide to StpUtil utility class
- Permission Matching Rules - How permission checking works
- Examples - Working examples for all supported frameworks
🔧 Advanced Usage
Custom Storage
Implement the SaStorage trait for your own storage backend:
use SaStorage;
use async_trait;
;
Token Configuration
let state = builder
.storage
.token_name // Custom token name
.timeout // Token timeout (seconds)
.active_timeout // Activity timeout (seconds)
.build;
🤝 Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
📄 License
This project is licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
at your option.
👨💻 Author
金书记
🙏 Acknowledgments
This project is inspired by sa-token Java framework.