3个不稳定版本
0.2.0 | 2024年5月17日 |
---|---|
0.1.2 | 2023年12月28日 |
0.1.1 | 2023年12月28日 |
#2 在 #session-store
28,622 每月下载量
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::Client
和 DynamoDBStoreProps
实例后,可以配置 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