14个版本 (破坏性)
新功能 0.14.2 | 2024年8月20日 |
---|---|
0.14.1 | 2024年7月16日 |
0.14.0 | 2024年4月12日 |
0.13.0 | 2024年3月11日 |
0.1.5 |
|
#19 in HTTP服务器
3,013 每月下载量
用于 8 crates
145KB
2.5K SLoC
Axum Session
📑 概述
`axum_session` 提供了一个会话管理中间件,该中间件在内部将所有会话数据存储在 MemoryStore 中。可选地将数据保存到持久数据库以进行长期存储。使用存储在 Cookie 或 Header 中的 UUID 同步回会话存储。
- 生成的会话 UUID 的 Cookie 或 Header 存储,以及一个 Store 布尔值。
- 使用 DatabasePool 特性,您可以实现自己的子存储层。
- 为
Session
提供方便的 API,无需标记为读或写,使使用更简单。 - 使用
dashmap
进行内部内存查找和存储,以实现高吞吐量。 - 使用 Serdes 进行数据序列化,因此可以将任何 Serdes 支持的类型存储到会话数据中。
- 支持开箱即用的 Redis、SurrealDB、MongoDB 和 SQLx 可选数据库。
- 支持仅使用内存。无需使用持久数据库。
- 支持 Cookie 和 Header 签名以确保完整性和真实性。
- 支持数据库会话数据加密以确保机密性和完整性。
- 支持会话 ID 更新以增强安全性。
- 可选的 Fastbloom 键存储,以减少新 UUID 生成期间的数据库查找,提高带宽。
- 可选的 Rest 模式,禁用 Cookie 并使用 Header 值代替。
- 使用
#![forbid(unsafe_code)]
确保一切都以安全的 Rust 实现。 - 具有一个
advanced
API,允许进一步控制会话。 - 使用 IP 地址和用户代理来防止对签名 Cookie 和 Header 的欺骗。
🚨 帮助
如果您需要关于此库的帮助或有建议,请访问我们的 Discord 群组
📦 安装
Axum 会话使用 tokio
将其包含在 Axum 会话的 cargo 中。
# Cargo.toml
[dependencies]
# Postgres + rustls
axum_session = { version = "0.14.0" }
📱 Cargo 功能标志
功能 | 描述 |
---|---|
高级 |
启用允许更直接控制会话的功能。 |
rest_mode |
禁用 Cookie 处理,仅用于 Rest API 请求和响应的 Header 使用。 |
key-store |
启用可选的关键存储。将根据 Fastbloom 设置增加 RAM 使用。 |
数据库 Crate | 持久化 | 描述 |
---|---|---|
axum_session_sqlx |
是 | Sqlx 会话存储 |
axum_session_surreal |
是 | Surreal 会话存储 |
axum_session_mongo |
是 | Mongo 会话存储 |
axum_session_redispool |
是 | RedisPool 会话存储 |
🔎 示例默认设置
您可以在 Repository
中找到示例。
use sqlx::{ConnectOptions, postgres::{PgPoolOptions, PgConnectOptions}};
use std::net::SocketAddr;
use axum_session::{Session, SessionPgPool, SessionConfig, SessionStore, SessionLayer};
use axum::{
Router,
routing::get,
};
use tokio::net::TcpListener;
#[tokio::main]
async fn main() {
let poll = connect_to_database().await.unwrap();
//This Defaults as normal Cookies.
//To enable Private cookies for integrity, and authenticity please check the next Example.
let session_config = SessionConfig::default()
.with_table_name("sessions_table");
// create SessionStore and initiate the database tables
let session_store = SessionStore::<SessionPgPool>::new(Some(poll.clone().into()), session_config).await.unwrap();
// build our application with some routes
let app = Router::new()
.route("/greet", get(greet))
.layer(SessionLayer::new(session_store));
// run it
let addr = SocketAddr::from(([0, 0, 0, 0], 8000));
println!("listening on {}", addr);
let listener = TcpListener::bind(addr).await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn greet(session: Session<SessionPgPool>) -> String {
let mut count: usize = session.get("count").unwrap_or(0);
count += 1;
session.set("count", count);
count.to_string()
}
async fn connect_to_database() -> anyhow::Result<sqlx::Pool<sqlx::Postgres>> {
// ...
unimplemented!()
}
🔑 密钥存储详情
为了启用并使用快速 Bloom 密钥存储以减少数据库查找,请将功能 "key-store"
添加到 crate 的功能中。此功能将增加服务器端的 RAM 使用,但将大大提高带宽限制并减少服务器返回的延迟。这取决于 filter_expected_elements
和 filter_false_positive_probability
的设置。它们越高,使用的 RAM 就越多。您还需要在配置中启用 bloom 过滤器才能使用它。默认情况下,use_bloom_filters
已启用,并且无论功能是否启用,都存在这些配置选项。请参阅文档中的 with_filter_expected_elements
和 with_filter_false_positive_probability
以设置选项。否则,请坚持使用默认设置,这在大多数情况下应该适用。只需注意,这些选项提供了当将 UUID 与当前存在的值进行比较时可能发生的假阳性数量,这意味着它将不断尝试,直到找到匹配项。较高的值会降低假阳性的可能性,但会增加 RAM 使用。
😎 通过 axum_session_auth
进行会话登录和身份验证
有关用户登录、登录缓存和身份验证,请参阅 axum_session_auth
。
依赖项
~10–18MB
~236K SLoC