`axum_session` provide's a Session management middleware that stores all session data within a MemoryStore internally. It can also save data to an optional persistent database. It uses a Cookie inserted UUID to sync back to the memory store. Formally known as Axum Database Sessions.
Session
no need to mark as Read or Write making Usage Easier. dashmap
for internal memory lookup and storage to achieve high throughput.If you need help with this library or have suggestions please go to our Discord Group
Axum Session uses [tokio
].
By Default Axum Session uses postgres-rustls
so if you need tokio native TLS please add default-features = false
to your cargo include for Axum Session.
```toml
[dependencies]
axum_session = { version = "0.1.1", features = [ "postgres-rustls"] } ```
default
: [postgres-rustls
]
sqlite-rustls
: Sqlx 0.6.0
support for the self-contained SQLite database engine and rustls
.
sqlite-native
: Sqlx 0.6.0
support for the self-contained SQLite database engine and native-tls
.
postgres-rustls
: Sqlx 0.6.0
support for the Postgres database server and rustls
.
postgres-native
: Sqlx 0.6.0
support for the Postgres database server and native-tls
.
mysql-rustls
: Sqlx 0.6.0
support for the MySQL/MariaDB database server and rustls
.
mysql-native
: Sqlx 0.6.0
support for the MySQL/MariaDB database server and native-tls
.
redis-db
: redis 0.21.5
session support.
surrealdb-rocksdb
: surrealdb 1.0.0-beta.8
support for rocksdb.
surrealdb-tikv
: surrealdb 1.0.0-beta.8
support for tikv.
surrealdb-indxdb
: surrealdb 1.0.0-beta.8
support for indxdb.
surrealdb-fdb-?_?
: surrealdb 1.0.0-beta.8
support for fdb versions 51, 52, 60, 61, 62, 63, 70, 71. Replace ?_? with version.
surrealdb-mem
: surrealdb 1.0.0-beta.8
support for mem.
```rust ignore use sqlx::{ConnectOptions, postgres::{PgPoolOptions, PgConnectOptions}}; use std::net::SocketAddr; use axum_session::{Session, SessionPgPool, SessionConfig, SessionStore, SessionLayer}; use axum::{ Router, routing::get, };
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("test_table");
let session_store = SessionStore::<SessionPgPool>::new(Some(poll.clone().into()), session_config);
//Create the Database table for storing our Session Data.
session_store.initiate().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(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
async fn greet(session: Session
count += 1;
session.set("count", count);
count.to_string()
}
async fn connecttodatabase() -> anyhow::Result
To enable private cookies for confidentiality, integrity, and authenticity. When a Key is set it will automatically set the Cookie into an encypted Private cookie which both protects the cookies data from prying eye's it also ensures the authenticity of the cookie.
```rust ignore use sqlx::{ConnectOptions, postgres::{PgPoolOptions, PgConnectOptions}}; use std::net::SocketAddr; use axum_session::{Session, SessionPgPool, SessionConfig, SessionStore, SessionLayer, SessionMode, Key}; use axum::{ Router, routing::get, };
async fn main() { let sessionconfig = SessionConfig::default() .withtablename("testtable") // 'Key::generate()' will generate a new key each restart of the server. // If you want it to be more permanent then generate and set it to a config file. // If withkey() is used it will set all cookies as private, which guarantees integrity, and authenticity. .withkey(Key::generate());
let session_store = SessionStore::<SessionPgPool>::new(None, session_config);
session_store.initiate().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(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
} ```
To use axumsession in nonpersistant mode Set the client to None and import SessionNullPool. SessionNullPool is always loaded and can be used where you do not want to include any database within the build.
```rust ignore use sqlx::{ConnectOptions, postgres::{PgPoolOptions, PgConnectOptions}}; use std::net::SocketAddr; use axum_session::{Session, SessionNullPool, SessionConfig, SessionStore, SessionLayer}; use axum::{ Router, routing::get, };
async fn main() { let sessionconfig = SessionConfig::default() .withtablename("testtable");
let session_store = SessionStore::<SessionNullPool>::new(None, session_config);
// 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(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
async fn greet(session: Session
count += 1;
session.set("count", count);
count.to_string()
}
```
To use axum_session with session mode set as Storable.
```rust ignore use sqlx::{ConnectOptions, postgres::{PgPoolOptions, PgConnectOptions}}; use std::net::SocketAddr; use axum_session::{Session, SessionPgPool, SessionConfig, SessionStore, SessionLayer, SessionMode}; use axum::{ Router, routing::get, };
async fn main() { let sessionconfig = SessionConfig::default() .withtablename("testtable").with_mode(SessionMode::Storable);
let session_store = SessionStore::<SessionPgPool>::new(None, session_config);
session_store.initiate().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(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
//No need to set the sessions accepted or not with gdpr mode disabled
async fn greet(session: Session
// Allow the Session data to be keep in memory and the database for the lifetime.
session.set_store(true);
count += 1;
session.set("count", count);
count.to_string()
}
```
axum_session_auth
For user login, login caching and authentication please see axum_session_auth
.