Addict示例应用逐行解析:读懂Phoenix用户管理库的完整落地姿势

发布时间:2026/8/24 9:23:00
Addict示例应用逐行解析:读懂Phoenix用户管理库的完整落地姿势 Addict示例应用逐行解析读懂Phoenix用户管理库的完整落地姿势【免费下载链接】addictUser management lib for Phoenix Framework项目地址: https://gitcode.com/gh_mirrors/add/addictAddict 是一款专为Phoenix FrameworkElixir 生态打造的用户管理库一个依赖即可让应用快速拥有用户注册、登录、登出和密码找回/重置全套功能。本文带你逐层拆解它自带的 Example App示例应用读懂这个 Phoenix 用户管理库从配置、路由到控制器的完整落地姿势零基础也能看懂。一、先认识 Addict 能做什么 在动手之前先明确这个 Phoenix 用户管理库的边界✅ 用户注册邮箱 密码密码自动加密存储✅ 用户登录 / 登出Session 管理✅ 密码找回 / 重置邮件发送重置链接Token 带签名和过期时间✅ 可选邮件服务默认对接 Mailgun也支持自定义整个能力由两部分组成组成路径作用核心库lib/addict/控制器、Interactor 业务流、加密、Plug示例应用example_app/一个真实可跑的 Phoenix 应用演示完整接入方式二、获取代码并启动示例应用 git clone https://gitcode.com/gh_mirrors/add/addict cd addict/example_app mix deps.get mix ecto.create mix ecto.migrate mix phoenix.server启动后访问http://localhost:4000即可看到完整的注册/登录页面。示例应用的启动说明见example_app/README.md。三、mix.exs一行依赖接入用户管理打开example_app/mix.exs关键只有一行{:addict, path: ../}示例应用通过path: ../引用了上层的 Addict 库本身。正式项目里换成从 Hex 获取即可{:addict, ~ 0.3}。另外注意deps中的:postgrex和:phoenix_ecto——Addict 依赖Ecto作为数据访问层这是后文配置的重点。四、config.exs逐行读懂 Addict 核心配置这是全文最值得细读的一段。example_app/config/config.exs末尾的config :addict, ...块逐项对应一个落地决策config :addict, secret_key: 24326..., # ① Token 签名密钥 extra_validation: {ExampleApp.User, :validate}, # ② 自定义校验钩子 user_schema: ExampleApp.User, # ③ 你的 User 模型 repo: ExampleApp.Repo, # ④ 数据库连接 from_email: no-replyexample.com, # ⑤ 发件人邮箱 mailgun_domain: ..., mailgun_key: ..., # ⑥ Mailgun 凭据 mail_service: :mailgun, # ⑦ 邮件服务商 post_register: {ExampleApp, :post_register_hook}, # ⑧ 动作后钩子 post_login: {ExampleApp, :post_login_hook}, post_logout: {ExampleApp, :post_logout_hook}, post_reset_password: {ExampleApp, :post_reset_password_hook}, post_recover_password: {ExampleApp, :post_recover_password_hook}逐条解释secret_key用于生成密码重置 Token 的签名生产环境务必替换为随机长字符串user_schema / repoAddict 不绑定具体模型它通过这两个配置注入你的 User 模型和 Ecto Repo——这就是所谓依赖注入思想在 Ecto 中的应用extra_validation注册/登录前的自定义校验入口签名固定为validate({:ok, _} | {:error, errors}, user_params)示例实现就在example_app/web/models/user.ex的validate/2post_系列钩子*注册、登录、登出、重置密码、找回密码成功后都会回调可在此接入埋点、打日志或推送消息扩展方式详见 configs.md。 如果不想用 Mailgun只要让模块实现lib/addict/mailers/generic.ex定义的行为把mail_service换成你的模块名即可——这就是 Addict 的自定义邮件服务商扩展点。五、User 模型最小契约与自定义校验Addict 对 User 模型只有一个最小要求——README.md 中写得很清楚field :email, :string field :encrypted_password, :string示例模型example_app/web/models/user.ex在此基础上多了个name字段并实现了配置中声明的validate/2钩子。默认规则密码至少 6 位、邮箱合法且不重复。配套的数据表由迁移文件创建example_app/priv/repo/migrations/20160229201901_create_user.exs。六、router.ex一行 addict :routes 生成全部路由example_app/web/router.ex是整个接入过程最魔法的部分use Addict.RoutesHelper ... pipeline :addict_routes do plug :accepts, [json] plug :fetch_session plug :fetch_flash plug :put_secure_browser_headers plug :put_layout, {Addict.AddictView, addict.html} end scope / do pipe_through :addict_routes addict :routes endaddict :routes一个函数调用就自动注册了 5 条路由路由方法说明/registerPOST用户注册/loginPOST用户登录/logoutDELETE登出/recover_passwordPOST发送找回密码邮件/reset_passwordPOST提交新密码完成重置想改路径或换控制器可以按路由名覆盖例如addict :routes, logout: [path: /sign-out]规则同样写在lib/addict/routes_helper.ex。七、控制器登录鉴权与页面渲染7.1 鉴权保护一行 Plug 拦住未登录请求example_app/web/controllers/page_controller.ex演示了最实用的鉴权姿势plug Addict.Plugs.Authenticated when action in [:required_login]访问/required_login时若 Session 里没有current_user请求会被重定向到登录页可用not_logged_in_url配置自定义跳转地址。7.2 页面渲染UserManagementControllerexample_app/web/controllers/user_management_controller.ex展示了服务端渲染的完整闭环register/2、login/2等 action 各自渲染对应模板如web/templates/user_management/_login.html.eex并在模板中注入 CSRF Token。表单提交后请求最终落到 Addict 自己的Addict.Controller处理。八、幕后机制Interactor 业务流全景图 路由和控制器只是面子真正的用户管理逻辑藏在lib/addict/interactors/目录每个文件对应一个单一职责的业务单元用户注册流程 register → validate_user_for_registration → generate_encrypted_password密码加密 → insert_user写入数据库 → 发送注册邮件可选 登录流程 login → get_user_by_email → verify_password → create_session写入 Session 密码重置流程 send_reset_password_link → generate_password_reset_link带签名的Token默认24小时过期 reset_password → verify_password → update_user_password所有 Token 的生成与校验都基于 crypto.exBcrypt 加密 签名密码策略可用password_hasher配置替换。理解这条链路后你就明白了为什么 Addict 只需一个模型 一个 Repo 一段配置就能跑起来。九、模板层开箱即用的 HTML 表单example_app/web/templates/下包含user_management/注册、登录、找回密码、重置密码、用户列表等页面addict/Addict 自带的 AJAX 表单模板boilerplate/目录另有可直接复制的登录/注册页面骨架。前端通过普通表单提交即可完成注册登录无需额外 JS 依赖。十、从示例到生产落地清单 ✅步骤操作参考位置1添加依赖mix.exs2运行mix addict.generate.configs生成配置config/config.exs3运行mix addict.generate.boilerplate生成页面模板boilerplate/4Router 中use Addict.RoutesHelperaddict :routesexample_app/web/router.ex5用Addict.Plugs.Authenticated保护私有路由lib/addict/plugs/authenticated.ex6按需配置 post_* 钩子与邮件参数configs.md总结Addict 的 Example App 是一份麻雀虽小、五脏俱全的 Phoenix 用户管理接入范本配置驱动模型、Repo、邮件、钩子全部通过config :addict注入零侵入一行路由addict :routes即得注册/登录/找回密码全套端点职责清晰Interactor 目录把注册、登录、重置密码等流程拆成可独立测试的小模块test/interactors/下有完整测试可参考。读完这份示例你已掌握这个 Phoenix 用户管理库的完整落地姿势——剩下的就是把它搬进你自己的项目里了。【免费下载链接】addictUser management lib for Phoenix Framework项目地址: https://gitcode.com/gh_mirrors/add/addict创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考