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
