1
0
mirror of https://github.com/actix/actix-extras.git synced 2025-02-25 11:32:50 +01:00

Fix CI build errors

This commit is contained in:
James Eastham 2024-01-28 09:07:33 +00:00
parent 09221c1147
commit 7f4437b38d
3 changed files with 81 additions and 4 deletions

View File

@ -28,7 +28,7 @@ provided by `actix-session`; it takes care of all the session cookie handling an
against the active [`Session`]. against the active [`Session`].
`actix-session` provides some built-in storage backends: ([`CookieSessionStore`], `actix-session` provides some built-in storage backends: ([`CookieSessionStore`],
[`RedisSessionStore`], and [`RedisActorSessionStore`]) - you can create a custom storage backend [`RedisSessionStore`], [`RedisActorSessionStore`], and [`DynamoDbSessionStore`]) - you can create a custom storage backend
by implementing the [`SessionStore`] trait. by implementing the [`SessionStore`] trait.
Further reading on sessions: Further reading on sessions:
@ -133,12 +133,22 @@ attached to your sessions. You can enable:
actix-session = { version = "...", features = ["redis-rs-session", "redis-rs-tls-session"] } actix-session = { version = "...", features = ["redis-rs-session", "redis-rs-tls-session"] }
``` ```
- a DynamoDB-based backend via [`dynamo-db`](https://docs.rs/aws-sdk-dynamodb), [`DynamoDbSessionStore`], using
the `dynamo-db` feature flag.
```toml
[dependencies]
# ...
actix-session = { version = "...", features = ["dynamo-db"] }
```
You can implement your own session storage backend using the [`SessionStore`] trait. You can implement your own session storage backend using the [`SessionStore`] trait.
[`SessionStore`]: storage::SessionStore [`SessionStore`]: storage::SessionStore
[`CookieSessionStore`]: storage::CookieSessionStore [`CookieSessionStore`]: storage::CookieSessionStore
[`RedisSessionStore`]: storage::RedisSessionStore [`RedisSessionStore`]: storage::RedisSessionStore
[`RedisActorSessionStore`]: storage::RedisActorSessionStore [`RedisActorSessionStore`]: storage::RedisActorSessionStore
[`DynamoDbSessionStore`]: storage::DynamoDbSessionStore
*/ */
#![forbid(unsafe_code)] #![forbid(unsafe_code)]

View File

@ -17,6 +17,52 @@ use crate::storage::{
SessionStore, SessionStore,
}; };
/// Use DynamoDB as session storage backend.
///
/// ```no_run
/// use actix_web::{web, App, HttpServer, HttpResponse, Error};
/// use actix_session::{SessionMiddleware, storage::DynamoDbSessionStore};
/// use actix_web::cookie::Key;
/// use aws_config::meta::region::RegionProviderChain;
/// use aws_config::Region;
/// use aws_config::default_provider::credentials::DefaultCredentialsChain;
/// use aws_sdk_dynamodb::config::ProvideCredentials;
/// use aws_sdk_dynamodb::Client;
///
///
/// // The secret key would usually be read from a configuration file/environment variables.
/// fn get_secret_key() -> Key {
/// # todo!()
/// // [...]
/// }
///
/// #[actix_web::main]
/// async fn main() -> std::io::Result<()> {
/// let secret_key = get_secret_key();
///
/// let dynamo_db_store = DynamoDbSessionStore::builder()
/// .table_name(String::from("MyTableName"))
/// .key_name("PK".to_string())
/// .build()
/// .await?;
///
/// HttpServer::new(move ||
/// App::new()
/// .wrap(SessionMiddleware::new(
/// dynamo_db_store.clone(),
/// secret_key.clone()
/// ))
/// .default_service(web::to(|| HttpResponse::Ok())))
/// .bind(("127.0.0.1", 8080))?
/// .run()
/// .await
/// }
/// ```
///
/// # Implementation notes
/// `DynamoDbSessionStore` leverages [`aws-sdk-dynamodb`] as a DynamoDB client.
///
/// [`aws-sdk-dynamodb`]: https://github.com/awslabs/aws-sdk-rust
#[derive(Clone)] #[derive(Clone)]
pub struct DynamoDbSessionStore { pub struct DynamoDbSessionStore {
configuration: CacheConfiguration, configuration: CacheConfiguration,
@ -60,7 +106,7 @@ impl DynamoDbSessionStore {
/// As a default, it expects a DynamoDB table name of 'sessions', with a single partition key of 'SessionId' this can be overridden using the [`DynamoDbSessionStoreBuilder`]. /// As a default, it expects a DynamoDB table name of 'sessions', with a single partition key of 'SessionId' this can be overridden using the [`DynamoDbSessionStoreBuilder`].
pub fn builder() -> DynamoDbSessionStoreBuilder { pub fn builder() -> DynamoDbSessionStoreBuilder {
DynamoDbSessionStoreBuilder { DynamoDbSessionStoreBuilder {
configuration: CacheConfiguration::default(), configuration: CacheConfiguration::default()
} }
} }
@ -76,7 +122,7 @@ impl DynamoDbSessionStore {
/// [`DynamoDbSessionStore`]: crate::storage::DynamoDbSessionStore /// [`DynamoDbSessionStore`]: crate::storage::DynamoDbSessionStore
#[must_use] #[must_use]
pub struct DynamoDbSessionStoreBuilder { pub struct DynamoDbSessionStoreBuilder {
configuration: CacheConfiguration, configuration: CacheConfiguration
} }
impl DynamoDbSessionStoreBuilder { impl DynamoDbSessionStoreBuilder {
@ -99,6 +145,27 @@ impl DynamoDbSessionStoreBuilder {
self self
} }
/// Set the credentials to use for the DynamoDB client.
pub fn with_credentials(mut self, credentials: Credentials) -> Self {
self.configuration.credentials = Some(credentials);
self
}
/// Set the SDK config to use for the DynamoDB client.
pub fn with_sdk_config(mut self, config: Config) -> Self {
self.configuration.sdk_config = Some(config);
self
}
/// Set the region to use for the DynamoDB client.
pub fn with_region(mut self, region: Region) -> Self {
self.configuration.region = Some(region);
self
}
/// Set the endpoint to use if using DynamoDB Local. Defaults to 'http://localhost:8000'. /// Set the endpoint to use if using DynamoDB Local. Defaults to 'http://localhost:8000'.
pub fn dynamo_db_local_endpoint(mut self, dynamo_db_local_endpoint: String) -> Self { pub fn dynamo_db_local_endpoint(mut self, dynamo_db_local_endpoint: String) -> Self {
self.configuration.dynamo_db_local_endpoint = dynamo_db_local_endpoint; self.configuration.dynamo_db_local_endpoint = dynamo_db_local_endpoint;

View File

@ -20,7 +20,7 @@ mod redis_rs;
#[cfg(any(feature = "redis-actor-session", feature = "redis-rs-session"))] #[cfg(any(feature = "redis-actor-session", feature = "redis-rs-session"))]
mod utils; mod utils;
#[cfg(any(feature = "dynamo-db"))] #[cfg(feature = "dynamo-db")]
mod dynamo_db; mod dynamo_db;
#[cfg(feature = "cookie-session")] #[cfg(feature = "cookie-session")]