From ef5e8ec8bd2cf06cdc48b7d77ec9a85b370b4433 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 9 Apr 2018 09:10:48 +0200 Subject: feat(handlers): Add RequireLogin middleware Adds a middleware that automatically redirects users to the login page if they don't have an active session (i.e. 'author' set). --- src/handlers.rs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'src/handlers.rs') diff --git a/src/handlers.rs b/src/handlers.rs index 0531bb1742e7..e709fdd2023c 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -6,8 +6,9 @@ //! project root. use actix::prelude::{Addr, Syn}; +use actix_web; use actix_web::*; -use actix_web::middleware::RequestSession; +use actix_web::middleware::{Started, Middleware, RequestSession}; use db::*; use errors::{Result, ConverseError}; use futures::Future; @@ -120,6 +121,8 @@ pub fn login(state: State) -> ConverseResponse { .responder() } +const AUTHOR: &'static str = "author"; + pub fn callback(state: State, data: Form, mut req: HttpRequest) -> ConverseResponse { @@ -128,10 +131,30 @@ pub fn callback(state: State, .and_then(move |result| { let author = result?; info!("Setting cookie for {} after callback", author.name); - req.session().set("author_name", author.name)?; - req.session().set("author_email", author.email)?; + req.session().set(AUTHOR, author)?; Ok(HttpResponse::SeeOther() .header("Location", "/") .finish())}) .responder() } + + +/// Middleware used to enforce logins unceremonially. +pub struct RequireLogin; + +impl Middleware for RequireLogin { + fn start(&self, req: &mut HttpRequest) -> actix_web::Result { + let has_author = req.session().get::(AUTHOR)?.is_some(); + let is_oidc_req = req.path().starts_with("/oidc"); + + if !is_oidc_req && !has_author { + Ok(Started::Response( + HttpResponse::SeeOther() + .header("Location", "/oidc/login") + .finish() + )) + } else { + Ok(Started::Done) + } + } +} -- cgit 1.4.1