Browse Source

Create middleware to require not being logged in

master
Dylan Baker 3 years ago
parent
commit
9719325741
3 changed files with 25 additions and 13 deletions
  1. 11
    8
      src/main.rs
  2. 14
    0
      src/middleware.rs
  3. 0
    5
      src/routes.rs

+ 11
- 8
src/main.rs View File

@@ -2,6 +2,8 @@ use dotenv;
2 2
 
3 3
 use tide::utils::After;
4 4
 
5
+use middleware::*;
6
+
5 7
 mod fs;
6 8
 mod middleware;
7 9
 mod post;
@@ -13,24 +15,25 @@ async fn main() -> std::io::Result<()> {
13 15
     tide::log::start();
14 16
     let mut app = tide::new();
15 17
 
16
-    app.with(After(middleware::errors));
17
-    app.with(middleware::session());
18
+    app.with(After(errors));
19
+    app.with(session());
18 20
 
19 21
     app.at("/").get(routes::index);
20 22
     app.at("/posts")
21
-        .with(middleware::require_auth)
23
+        .with(require_auth)
22 24
         .post(routes::create_post);
23 25
     app.at("/posts/:id")
24 26
         .get(routes::single_post)
25 27
         .post(routes::update_post)
26 28
         .delete(routes::delete_post);
27 29
     app.at("/posts/:id/edit")
28
-        .with(middleware::require_auth)
30
+        .with(require_auth)
29 31
         .get(routes::edit_post);
30
-    app.at("/login").get(routes::login_page).post(routes::login);
31
-    app.at("/logout")
32
-        .with(middleware::require_auth)
33
-        .post(routes::logout);
32
+    app.at("/login")
33
+        .with(require_guest)
34
+        .get(routes::login_page)
35
+        .post(routes::login);
36
+    app.at("/logout").with(require_auth).post(routes::logout);
34 37
 
35 38
     app.listen("127.0.0.1:8080").await?;
36 39
 

+ 14
- 0
src/middleware.rs View File

@@ -35,6 +35,20 @@ pub fn require_auth<'a>(
35 35
     })
36 36
 }
37 37
 
38
+pub fn require_guest<'a>(
39
+    req: Request<()>,
40
+    next: Next<'a, ()>,
41
+) -> Pin<Box<dyn Future<Output = Result> + 'a + Send>> {
42
+    Box::pin(async {
43
+        let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
44
+        if logged_in {
45
+            Ok(Redirect::new("/").into())
46
+        } else {
47
+            Ok(next.run(req).await)
48
+        }
49
+    })
50
+}
51
+
38 52
 pub async fn errors(mut res: Response) -> Result<Response> {
39 53
     let mut context = Context::new();
40 54
 

+ 0
- 5
src/routes.rs View File

@@ -76,11 +76,6 @@ pub async fn login_page(mut req: Request<()>) -> Result {
76 76
 }
77 77
 
78 78
 pub async fn login(mut req: Request<()>) -> Result {
79
-    let logged_in: bool = req.session().get("logged_in").unwrap_or(false);
80
-    if logged_in {
81
-        return Ok(Redirect::new("/").into());
82
-    }
83
-
84 79
     let username = env::var("ADMIN_USERNAME")?;
85 80
     let password = env::var("ADMIN_PASSWORD")?;
86 81
     let user: User = req.body_form().await?;

Loading…
Cancel
Save