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).
This commit is contained in:
		
							parent
							
								
									d91dec28f8
								
							
						
					
					
						commit
						ef5e8ec8bd
					
				
					 2 changed files with 27 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -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<AppState>) -> ConverseResponse {
 | 
			
		|||
        .responder()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const AUTHOR: &'static str = "author";
 | 
			
		||||
 | 
			
		||||
pub fn callback(state: State<AppState>,
 | 
			
		||||
                data: Form<CodeResponse>,
 | 
			
		||||
                mut req: HttpRequest<AppState>) -> ConverseResponse {
 | 
			
		||||
| 
						 | 
				
			
			@ -128,10 +131,30 @@ pub fn callback(state: State<AppState>,
 | 
			
		|||
        .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 <S> Middleware<S> for RequireLogin {
 | 
			
		||||
    fn start(&self, req: &mut HttpRequest<S>) -> actix_web::Result<Started> {
 | 
			
		||||
        let has_author = req.session().get::<Author>(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)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ pub struct CodeResponse {
 | 
			
		|||
 | 
			
		||||
/// This struct represents the data extracted from the ID token and
 | 
			
		||||
/// stored in the user's session.
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
pub struct Author {
 | 
			
		||||
    pub name: String,
 | 
			
		||||
    pub email: String,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue