Addict后置操作钩子完全参考:登录、注册、登出后如何触发自定义逻辑
【免费下载链接】addictUser management lib for Phoenix Framework项目地址: https://gitcode.com/gh_mirrors/add/addict
Addict是面向 ElixirPhoenix Framework的现成用户管理库,负责注册、登录、登出与密码找回/重置这几大流程。本文聚焦它的后置操作钩子(post hooks):如何在这几类操作成功或失败之后,触发你自己的自定义逻辑(如打日志、发欢迎邮件、积分结算),只需 3 步即可接入。
什么是 Addict 后置操作钩子?🪝
用户在 Addict 中完成一次操作(比如登录)后,控制器并不会立刻返回响应,而是先调用你注册的“回调函数”,再返回结果。这个回调机制就是后置操作钩子。
调用点位于 lib/addict/controller.ex 的统一出口return_success/return_error中:每个动作的 POST 请求处理完后,Addict 都会把 3 个信息传给你的钩子函数:
conn—— 当前请求对象(可操作 session、响应头等)status—— 操作结果::ok(成功)或:error(失败)params—— 成功时是用户模型,失败时是错误列表
🔑 关键约定:钩子函数必须把
conn原样返回,Addict 依赖它继续完成后续的 JSON 响应流程。
Addict 提供的 5 个钩子配置一览
钩子统一配置在:addict配置段下(运行mix addict.generate.configs会生成基础配置,见 lib/addict/mix/generate_configs.ex):
| 配置项 | 触发时机 | 典型场景 |
|---|---|---|
post_register | 用户注册后 | 发欢迎邮件、初始化用户数据 |
post_login | 用户登录后 | 记录登录日志、积分结算 |
post_logout | 用户登出后 | 清理缓存、作废旧令牌 |
post_recover_password | 发送重置密码邮件后 | 审计留痕、通知 |
post_reset_password | 密码重置完成后 | 清除旧令牌、通知用户 |
五个钩子签名完全一致,记一个即可全部套用。官方配置说明在 configs.md,完整配置项清单见 lib/addict/configs.ex。
3 步接入指南:如何配置 post_login
以“登录成功后打一条日志”为例,完整走一遍接入流程,其余四个钩子照搬即可。
第一步:定义你的钩子函数
函数签名固定为 3 个参数conn, status, params,并返回conn:
defmodule MyApp.PostLoginAction do def log(conn, status, model) do IO.inspect(status) IO.inspect(model) conn # 别忘了返回! end end第二步:在 config.exs 中注册钩子
在:addict配置块里加上钩子(生成器会把 Addict 配置追加到config/config.exs):
config :addict, (...), post_login: &MyApp.PostLoginAction.log/3常见写法有两种:
- 函数引用:
post_login: &MyApp.PostLoginAction.log/3 - 模块 + 函数元组:
post_logout: {MyApp, :post_logout_hook}—— 参考 example_app/config/config.exs 中的示例配置,那里把 5 个钩子全部接上了
不配置(或配置为nil)时,Addict 会直接跳过钩子,因此该能力完全可选,不影响默认行为。
第三步:验证生效
把 Addict 加入依赖、跑通路由后,完成一次登录,看控制台是否出现你的日志。想从请求到响应完整跑一遍,可以克隆仓库并使用其中的示例工程:
git clone https://gitcode.com/gh_mirrors/add/addict区分“成功”与“失败”:模式匹配 status 参数 ⚡
钩子在成功和失败时都会触发,两者的status与第三个参数不同:
| status | 第三个参数 | 含义 |
|---|---|---|
:ok | 用户模型(user model) | 操作成功 |
:error | 错误信息列表 | 操作失败(如密码错误、邮箱重复) |
利用函数重载,就能在同一个钩子里写出分支逻辑:
def log(conn, :ok, model) do IO.puts("登录成功,用户 ID: #{model[:id]}") conn end def log(conn, :error, errors) do IO.puts("登录失败: #{inspect(errors)}") conn end由此可以实现“仅在登录失败时计数(防暴力破解审计)”“仅在注册成功时发奖励”等精细策略。
常用后置操作钩子场景清单 📌
| 场景 | 建议钩子 | 思路 |
|---|---|---|
| 登录审计 / 风控 | post_login | :error分支按来源累计失败次数 |
| 注册即送奖励 | post_register | :ok分支创建奖励记录 |
| 欢迎邮件 | post_register | 在 Addict 自带发信之外补充业务邮件 |
| 会话清理 | post_logout | 删除该用户的缓存数据 |
| 改密通知 | post_reset_password | 通知用户密码已变更 |
💡 建议:钩子保持轻量。发邮件、调外部接口等耗时操作,放到后台任务或消息队列中执行,避免拖慢登录接口的响应时间。
避开 3 个常见坑 🚫
- 忘记返回
conn—— 钩子是响应管线的一环,漏写返回值会导致请求无法正常返回。 - 把第三个参数当成用户模型处理——
:error时拿到的是错误列表,直接取model[:id]会崩溃,务必用模式匹配区分。 - 配置位置写错—— 钩子必须写在
config :addict,配置块内,而不是应用自己的配置块中;生成配置后先确认文件里已有:addict段。
小结:Addict 后置操作钩子 5 个配置 + 1 套签名
- 5 个钩子:
post_register、post_login、post_logout、post_recover_password、post_reset_password - 统一签名:
(conn, status, params) -> conn - 成功拿到用户模型,失败拿到错误列表,用模式匹配分流
- 不配置即不启用,配置后立即生效
从post_login开始接第一个钩子,跑通后再逐个补齐其余四个,你的 Phoenix 应用就拥有了完整的用户行为扩展点。🎉
【免费下载链接】addictUser management lib for Phoenix Framework项目地址: https://gitcode.com/gh_mirrors/add/addict
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考