Strumenti Utente

Strumenti Sito


programmazione:d:vibe-d:hello_world

Un hello world per Vibe.d con autenticazione basata sulle sessioni

Autore: Fabio Di Matteo
Ultima revisione: 14/07/2025 13:09

Per ogni rotta basta la funzione checkLogin per proteggerne l'accesso:

...
void index(HTTPServerRequest req, HTTPServerResponse res)
{
	checkLogin(req, res);
 
        res.render!("home.dt", req);
}
...

Ecco il codice completo.

app.d

import vibe.vibe;
import std.stdio;
 
void logout(HTTPServerRequest req, HTTPServerResponse res)
{
	res.terminateSession();
	res.redirect("/app");
}
 
void checkLogin(HTTPServerRequest req, HTTPServerResponse res)
{
	if (req.session)
	{
		auto user=req.session.get("username","0");
		auto pass=req.session.get("password","0");
 
		//logica di autenticazione fittizia
		if (user=="fabio" && pass=="fabio")
		{
			writeln("Logged in");
			return;
		}else{
			writeln("Not logged in");
			res.redirect("/app/formlogin");
		}
	}else{
		auto session = res.startSession();
		res.redirect("/app/formlogin");
	}	
 
}
 
void index(HTTPServerRequest req, HTTPServerResponse res)
{
	checkLogin(req, res);
	res.render!("home.dt", req);
}
 
void formLogin(HTTPServerRequest req, HTTPServerResponse res)
{
	res.render!("form_login.dt", req);
}
 
void errorPage(HTTPServerRequest req,
	HTTPServerResponse res,
	HTTPServerErrorInfo error)
{
	res.render!("error.dt", req, error);
}
 
 
void login(HTTPServerRequest req, HTTPServerResponse res)
{
	enforceHTTP("username" in req.form && "password" in req.form,
		HTTPStatus.badRequest, "Missing username/password field.");
 
	writeln("username: ", req.form["username"]);
	writeln("password: ", req.form["password"]);
 
	try{
		req.session.set("username", req.form["username"]);
		req.session.set("password", req.form["password"]);
		res.redirect("/app");
	}catch (Exception e){
		writeln(e.msg);
	}
}
 
 
void pagina2(HTTPServerRequest req, HTTPServerResponse res)
{
	checkLogin(req, res);
	res.render!("pagina2.dt", req);
}
 
void main()
{
	auto router = new URLRouter;
	router.get("/app", &index);
	router.get("/app/pagina2",&pagina2);
	router.get("/app/formlogin", &formLogin);
	router.post("/app/login", &login);
	router.get("/app/logout", &logout);
 
	auto fsettings = new HTTPFileServerSettings;
	fsettings.serverPathPrefix = "/app/static";
	router.get("/app/static/*", serveStaticFiles("./static/", fsettings));
 
	auto settings = new HTTPServerSettings;
	settings.port = 8080;
	settings.sessionStore = new MemorySessionStore;
 
	listenHTTP(settings, router);
	runApplication();
}

form_login.dt

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="/app/static/css/pico.min.css">
    <title>Login</title>
</head>
<body>
 
<main class="container">
<div class="login-container">
    <h2>Login</h2>
    <form action="/app/login" method="post">
        <label for="username">Nome utente:</label>
        <input type="text" id="username" name="username" required>
 
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
 
        <input type="submit" value="Accedi">
    </form>
</div>
</main>
</body>
</html>

Struttura progetto

.
├── dub.json
├── dub.selections.json
├── source
│   └── app.d
├── static
│   └── css
│       └── pico.min.css
├── views
│   ├── error.dt
│   ├── form_login.dt
│   ├── home.dt
│   └── pagina2.dt
└── web-test
programmazione/d/vibe-d/hello_world.txt · Ultima modifica: 02/10/2025 14:26 da Fabio Di Matteo