From 372dfa3f31e504fde283be5a5ac06d133cd12592 Mon Sep 17 00:00:00 2001 From: Pierre Hubert Date: Fri, 1 Apr 2022 19:05:40 +0200 Subject: [PATCH] User can sign out --- src/controllers/login_controller.rs | 24 +++++++++++++++++++++--- src/main.rs | 5 ++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/controllers/login_controller.rs b/src/controllers/login_controller.rs index 3f7b4da..10bb078 100644 --- a/src/controllers/login_controller.rs +++ b/src/controllers/login_controller.rs @@ -26,18 +26,31 @@ struct LoginTemplate { } #[derive(serde::Deserialize)] -pub struct LoginRequest { +pub struct LoginRequestBody { login: String, password: String, } +#[derive(serde::Deserialize)] +pub struct LoginRequestQuery { + logout: Option, +} + /// Authenticate user pub async fn login_route(users: web::Data>, - req: Option>, + query: web::Query, + req: Option>, id: Identity) -> impl Responder { let mut danger = String::new(); + let mut success = String::new(); let mut login = String::new(); + // Check if user session must be closed + if let Some(true) = query.logout { + id.forget(); + success = "Goodbye!".to_string(); + } + // Check if user is already authenticated if SessionIdentity::is_authenticated(&id) { return redirect_user("/"); @@ -75,9 +88,14 @@ pub async fn login_route(users: web::Data>, _parent: BaseLoginPage { page_title: "Login", danger, - success: "".to_string(), + success, app_name: APP_NAME, }, login, }.render().unwrap()) +} + +/// Sign out user +pub async fn logout_route() -> impl Responder { + redirect_user("/login?logout=true") } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index a7296d0..1ae47b4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use clap::Parser; use basic_oidc::constants::{DEFAULT_ADMIN_PASSWORD, DEFAULT_ADMIN_USERNAME}; use basic_oidc::controllers::assets_controller::assets_route; -use basic_oidc::controllers::login_controller::login_route; +use basic_oidc::controllers::login_controller::{login_route, logout_route}; use basic_oidc::data::app_config::AppConfig; use basic_oidc::data::entity_manager::EntityManager; use basic_oidc::data::user::{hash_password, User}; @@ -81,6 +81,9 @@ async fn main() -> std::io::Result<()> { // Login page .route("/login", web::get().to(login_route)) .route("/login", web::post().to(login_route)) + + // Logout page + .route("/logout", web::get().to(logout_route)) }) .bind(config.listen_address)? .run()