Rocket/examples/session/src/main.rs

88 lines
2.2 KiB
Rust
Raw Normal View History

#![feature(plugin, custom_derive, custom_attribute)]
#![plugin(rocket_codegen)]
extern crate rocket_contrib;
extern crate rocket;
use std::collections::HashMap;
use rocket::Outcome;
use rocket::request::{self, Form, FlashMessage, FromRequest, Request};
use rocket::response::{Redirect, Flash};
use rocket::http::{Cookie, Session};
use rocket_contrib::Template;
#[derive(FromForm)]
struct Login {
username: String,
password: String
}
#[derive(Debug)]
struct User(usize);
impl<'a, 'r> FromRequest<'a, 'r> for User {
type Error = ();
fn from_request(request: &'a Request<'r>) -> request::Outcome<User, ()> {
let user = request.session()
.get("user_id")
.and_then(|cookie| cookie.value().parse().ok())
.map(|id| User(id));
match user {
Some(user) => Outcome::Success(user),
None => Outcome::Forward(())
}
}
}
#[post("/login", data = "<login>")]
fn login(mut session: Session, login: Form<Login>) -> Flash<Redirect> {
if login.get().username == "Sergio" && login.get().password == "password" {
session.set(Cookie::new("user_id", 1.to_string()));
Flash::success(Redirect::to("/"), "Successfully logged in.")
} else {
Flash::error(Redirect::to("/login"), "Invalid username/password.")
}
}
#[post("/logout")]
fn logout(mut session: Session) -> Flash<Redirect> {
session.remove(Cookie::named("user_id"));
Flash::success(Redirect::to("/login"), "Successfully logged out.")
}
#[get("/login")]
fn login_user(_user: User) -> Redirect {
Redirect::to("/")
}
#[get("/login", rank = 2)]
fn login_page(flash: Option<FlashMessage>) -> Template {
let mut context = HashMap::new();
if let Some(ref msg) = flash {
context.insert("flash", msg.msg());
}
Template::render("login", &context)
}
#[get("/")]
fn user_index(user: User) -> Template {
let mut context = HashMap::new();
context.insert("user_id", user.0);
Template::render("index", &context)
}
#[get("/", rank = 2)]
fn index() -> Redirect {
Redirect::to("/login")
}
fn main() {
rocket::ignite()
.mount("/", routes![index, user_index, login, logout, login_user, login_page])
.launch();
}