Can use Redis to store user sessions

This commit is contained in:
2025-12-04 18:11:27 +01:00
parent a2af039759
commit cb739ebe6d
8 changed files with 196 additions and 3 deletions

View File

@@ -6,7 +6,7 @@ use actix_identity::IdentityMiddleware;
use actix_identity::config::LogoutBehavior;
use actix_remote_ip::RemoteIPConfig;
use actix_session::SessionMiddleware;
use actix_session::storage::CookieSessionStore;
use actix_session::storage::{CookieSessionStore, RedisSessionStore};
use actix_web::cookie::{Key, SameSite};
use actix_web::middleware::Logger;
use actix_web::{App, HttpResponse, HttpServer, get, middleware, web};
@@ -26,6 +26,7 @@ use basic_oidc::data::provider::ProvidersManager;
use basic_oidc::data::user::User;
use basic_oidc::data::webauthn_manager::WebAuthManager;
use basic_oidc::middlewares::auth_middleware::AuthMiddleware;
use basic_oidc::middlewares::multi_session_store::MultiSessionStore;
#[get("/health")]
async fn health() -> &'static str {
@@ -69,6 +70,18 @@ async fn main() -> std::io::Result<()> {
.expect("Failed to change default admin password!");
}
let redis_store = match AppConfig::get().redis_connection_string() {
Some(s) => {
log::info!("Connect to Redis session store...");
Some(
RedisSessionStore::new(s)
.await
.expect("Failed to connect to Redis!"),
)
}
None => None,
};
let users_actor = UsersActor::new(users).start();
let bruteforce_actor = BruteForceActor::default().start();
let providers_states_actor = ProvidersStatesActor::default().start();
@@ -91,7 +104,10 @@ async fn main() -> std::io::Result<()> {
HttpServer::new(move || {
let session_mw = SessionMiddleware::builder(
CookieSessionStore::default(),
match redis_store.clone() {
None => MultiSessionStore::Cookie(CookieSessionStore::default()),
Some(s) => MultiSessionStore::Redis(s),
},
Key::from(config.token_key.as_bytes()),
)
.cookie_name(SESSION_COOKIE_NAME.to_string())