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 2023年3月31日

#19 in HTTP服务器

Download history 281/week @ 2024-05-03 284/week @ 2024-05-10 284/week @ 2024-05-17 434/week @ 2024-05-24 475/week @ 2024-05-31 454/week @ 2024-06-07 494/week @ 2024-06-14 355/week @ 2024-06-21 283/week @ 2024-06-28 222/week @ 2024-07-05 529/week @ 2024-07-12 780/week @ 2024-07-19 745/week @ 2024-07-26 715/week @ 2024-08-02 620/week @ 2024-08-09 772/week @ 2024-08-16

3,013 每月下载量
用于 8 crates

MIT/Apache

145KB
2.5K SLoC

Axum Session

https://crates.io/crates/axum_session Docs Discord Server

📑 概述

`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_elementsfilter_false_positive_probability 的设置。它们越高,使用的 RAM 就越多。您还需要在配置中启用 bloom 过滤器才能使用它。默认情况下,use_bloom_filters 已启用,并且无论功能是否启用,都存在这些配置选项。请参阅文档中的 with_filter_expected_elementswith_filter_false_positive_probability 以设置选项。否则,请坚持使用默认设置,这在大多数情况下应该适用。只需注意,这些选项提供了当将 UUID 与当前存在的值进行比较时可能发生的假阳性数量,这意味着它将不断尝试,直到找到匹配项。较高的值会降低假阳性的可能性,但会增加 RAM 使用。

😎 通过 axum_session_auth 进行会话登录和身份验证

有关用户登录、登录缓存和身份验证,请参阅 axum_session_auth

依赖项

~10–18MB
~236K SLoC