Luminus-template 认证实战:如何用 Buddy 为 Clojure Web 应用添加登录功能

📅 发布时间:2026/8/21 19:10:50
Luminus-template 认证实战:如何用 Buddy 为 Clojure Web 应用添加登录功能
Luminus-template 认证实战如何用 Buddy 为 Clojure Web 应用添加登录功能【免费下载链接】luminus-templatea template project for the Luminus framework项目地址: https://gitcode.com/gh_mirrors/lu/luminus-templateLuminus-template 是 Luminus 框架官方的项目模板内置了auth、auth-base、auth-jwe等多种认证功能开关可以帮你为 Clojure Web 应用快速添加登录、权限校验和会话管理。本文将以最常用的「Session 登录」为例一步步演示如何用 Buddy 库从零实现完整的用户登录功能全程无需手写复杂的认证逻辑。为什么选择 Luminus-template 做认证开发Luminus 是 Clojure 社区最流行的 Web 框架之一而 Luminus-template 把「创建项目」和「启用功能」做成了开箱即用的组合。当你需要登录功能时不需要四处寻找认证库、手动拼装依赖只需要在创建项目时加上几个特性开关模板就会自动生成配套代码。零成本起步一条命令生成带认证模块的完整项目骨架Buddy 全家桶认证、签名、密码哈希全部搞定多种认证方式Session、JWE Token 自由切换与数据库天然集成用户表、查询语句模板均已备好快速创建带认证功能的 Clojure Web 项目一键安装步骤使用auth特性首先确保你已安装 Leiningen版本 2.5.2 以上然后执行下面的命令创建项目lein new luminus myapp auth postgres这里auth表示启用 Session 登录postgres表示启用 PostgreSQL 数据库。模板会自动帮你完成以下工作在project.clj中引入buddy-auth、buddy-sign、buddy-core、buddy-hashers四个 Buddy 依赖见src/leiningen/new/auth_base.clj在中间件层注入wrap-authentication和wrap-authorization见src/leiningen/new/auth_base.clj生成session-backend会话后端配置见src/leiningen/new/auth.clj生成users用户表结构和增删改查 SQL见resources/leiningen/new/luminus/db/migrations/add-users-table.up.sql与resources/leiningen/new/luminus/db/sql/queries.sql最快配置方法一次性启用 JWE Token 认证如果你开发的是前后端分离应用Session 可能不是最佳选择。改用 JWEJSON Web EncryptionToken 方案更合适lein new myapp auth-jwe postgresauth-jwe会生成基于jwe-backend的 Token 认证后端使用a256kw算法加密、a128gcm算法签密Token 默认有效期 1 小时全部逻辑集中在resources/leiningen/new/luminus/core/src/middleware.clj中。 小提示auth-jwe会自动依赖auth-base所以无需手动同时添加。认识 BuddyClojure 登录功能的核心库Buddy 是 Clojure 生态中最成熟的认证安全库Luminus-template 依赖它实现了三层核心能力Buddy 模块职责buddy-auth认证后端、认证/授权中间件、访问规则buddy-signJWT / JWE 签名与加密buddy-core随机数、字节等底层工具buddy-hashers密码哈希与校验bcrypt 等模板生成的wrap-auth中间件会串联wrap-authentication与wrap-authorization并挂载在wrap-base中从而让整个应用的所有请求都具备认证能力。一步步搭建登录功能从建表到路由第一步设计用户表并编写查询模板已经为你准备好用户表结构字段包含id、email、pass、last_login、is_active等密码字段预留了 300 字符空间足以存放哈希后的结果。对应 SQL 查询create-user!、get-user、update-user!、delete-user!也已在resources/leiningen/new/luminus/db/sql/queries.sql中定义好。第二步使用 buddy-hashers 存储密码⚠️千万不要明文存储密码注册时使用buddy-hashers对密码做哈希处理登录时再校验(require [buddy.hashers :as hashers]) ;; 注册时 (hashers/derive my-password) ;; 登录时 (hashers/check my-password stored-hash)哈希后的密码安全性远高于明文即使数据库泄露也无法还原原始密码。第三步编写登录与登出路由认证相关的路由放在resources/leiningen/new/luminus/site/src/clj/auth.clj中。登录成功后把用户身份写入 Session登出时清除 Session 即可(require [buddy.auth :refer [authenticated?]] [ring.util.response :refer [response redirect]]) ;; 登录处理 (defn login! [{{:keys [username password]} :params}] (if (valid-credentials? username password) (- (redirect /) (assoc :session {:identity username})) (response 用户名或密码错误))) ;; 登出处理 (defn logout! [_] (- (redirect /) (assoc :session nil)))第四步用 wrap-restricted 保护受控路由某些页面只允许登录用户访问模板提供了现成的wrap-restricted中间件它基于restrict规则和authenticated?判断未登录用户会得到 403 错误页见resources/leiningen/new/luminus/core/src/middleware.clj(defroutes protected-routes (GET /profile [] (wrap-restricted profile-page)))常见问题与调优建议Session 过期时间模板默认使用 TTL 内存存储有效期 30 分钟可在wrap-base中调整ttl-memory-store参数登录后跳转通过assoc :session写入:identity后authenticated?会自动识别已登录状态部署到生产环境Session 存储建议替换为 Redis 等持久化方案避免重启丢失登录态前后端分离选择auth-jwe方案前端保存 Token 并在请求头携带即可写在最后借助 Luminus-template 与 Buddy你可以在十几分钟内为 Clojure Web 应用添加上完整、安全的登录功能而且 Session 与 JWE 两种主流方案都能开箱即用。创建项目时只要记得把auth或auth-jwe特性开关加上剩下的中间件、路由、数据库表结构模板都已经帮你安排妥当。如果你想亲自上手实践可以克隆模板仓库git clone https://gitcode.com/gh_mirrors/lu/luminus-template然后参考src/leiningen/new/auth.clj、src/leiningen/new/auth_base.clj等源码理解认证功能的生成逻辑再基于生成的代码自由扩展你的登录业务。祝你开发顺利【免费下载链接】luminus-templatea template project for the Luminus framework项目地址: https://gitcode.com/gh_mirrors/lu/luminus-template创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考