#tower-sessions #session-management #dynamo-db #session #session-store #tower

tower-sessions-dynamodb-store

AWS DynamoDB会话存储。不建议直接使用;有关详细信息,请参阅tower-sessions存储库。

3个不稳定版本

0.2.0 2024年5月17日
0.1.2 2023年12月28日
0.1.1 2023年12月28日

#2#session-store

Download history 124/week @ 2024-05-13 16/week @ 2024-05-20 2635/week @ 2024-06-17 17724/week @ 2024-06-24 12771/week @ 2024-07-01 8343/week @ 2024-07-08 7120/week @ 2024-07-15 6938/week @ 2024-07-22 7476/week @ 2024-07-29 6982/week @ 2024-08-05

28,622 每月下载量

MIT 许可证

26KB
370 代码行

tower-sessions-dynamodb-store

AWS DynamoDB后端的tower-sessions

概述

此创建提供了tower-session会话管理crate的AWS DynamoDB后端,使用Rust AWS-SDK。

用法

设置一个DynamoDBStore需要两个参数

  • 一个aws_sdk_dynamodb::Client实例,用于连接到AWS DynamoDB服务。
  • 一个DynamoDBStoreProps实例,以告诉会话存储在哪里在dynamo中查找/保存内容。

aws_sdk_dynamodb::客户端

设置aws_sdk_dynamodb::Client有很多可能性,但所有这些都需要一个aws_config::Config实例。如何获取一个aws_sdk_dynamodb::Client实例的最基本示例可以在aws_config rustdocs中找到,以及许多其他示例

use aws_config;
use aws_sdk_dynamodb;
let config = aws_config::load_defaults(aws_config::BehaviorVersion::v2023_11_09()).await;
let client = aws_sdk_dynamodb::Client::new(&config);

DynamoDBStoreProps

DynamoDBStoreProps实现了Default trait,因此可以使用DynamoDBStoreProps::default()获取一个假设DynamoDB表和属性名称的实例,但它更可能需要重写这些设置中的一个或多个;一个更复杂的示例

let store_props = DynamoDBStoreProps {
    table_name: "MyTowerSessions".to_string(),
    sort_key: Some(DynamoDBStoreKey {
        name: "sort_key".to_string(),
        prefix: Some("TOWER_SESSIONS::".to_string()),
        suffix: None,
    }),
    ..Default::default()
};

将创建一个存储属性实例

  • 使用名为MyTowerSession的DynamoDB表。
  • 使用默认的partition_key名称session_id,并在将其插入到session_id分区键属性之前,在所有tower会话ID前添加前缀SESSIONS::TOWER::
  • 使用定义的具有相同名称的 sort_key,在插入到 sort_key 范围键属性之前,将 TOWER_SESSIONS:: 的前缀添加到 session_id。
  • 使用 expire_at 的默认 expirey_name 属性名称来存储 tower-sessions 会话将过期时的 Unix 时间戳。
  • 使用 data 的默认 data_name 属性名称来存储 tower-sessions 键值会话数据的二进制序列化。

所有项目都可以安全地覆盖,目前对您的 DynamoDB 表的唯一假设是分区键和范围键属性都是 S(字符串)类型。

DynamoDBStore

创建 aws_sdk_dynamodb::ClientDynamoDBStoreProps 实例后,可以配置 DynamoDBStore 实例并将其传递给 tower-sessions 会话管理器。

use axum::{response::IntoResponse, routing::get, Router};
use time::Duration;
use tower_sessions::{Expiry, SessionManagerLayer};
use tower_sessions_dynamodb_store::DynamoDBStore;

let session_store = DynamoDBStore::new(client, store_props);
let session_layer = SessionManagerLayer::new(session_store)
    .with_secure(false) // only for local testing !!
    .with_expiry(Expiry::OnInactivity(Duration::seconds(10)));

let app = Router::new().route("/", get(handler)).layer(session_layer);

您可以在 示例目录 中找到完整的 示例

示例

计数器

计数器示例(通过 docker 使用 dynamodb-local

docker compose up dynamodb_store
cargo run --example counter

一旦 dynamodb-local 运行,如果一切正常,打开浏览器到 https://127.0.0.1:3000/,计数器应该增加,并且浏览器 cookie 存储中应该可见一个 cookie。

CloudFormation

有一个用于创建 AWS DynamoDB 表的 AWS CloudFormation 模板,该模板配置为使用 DynamoDBStoreProps::default() 设置。

aws cloudformation create-stack --stack-name ExampleTowerSessionsStack --template-body file:///$PWD/examples/example-table-cfn.yml

此外,此模板说明了在 expire_at 属性上使用 TimeToLiveSpecification 设置,配置 DynamoDB 自动删除已过期的会话。

构建

rustfmt

cargo fmt --all --check

clippy

cargo clippy --workspace --all-targets --all-features -- -D warnings

rustdoc

RUSTDOCFLAGS="-D rustdoc::broken-intra-doc-links" cargo doc --all-features --no-deps

依赖项

~19–27MB
~390K SLoC