Addict后置操作钩子完全参考:登录、注册、登出后如何触发自定义逻辑
2026/8/24 8:32:54 网站建设 项目流程

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 个信息传给你的钩子函数:

  1. conn—— 当前请求对象(可操作 session、响应头等)
  2. status—— 操作结果::ok(成功)或:error(失败)
  3. 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 个常见坑 🚫

  1. 忘记返回conn—— 钩子是响应管线的一环,漏写返回值会导致请求无法正常返回。
  2. 把第三个参数当成用户模型处理——:error时拿到的是错误列表,直接取model[:id]会崩溃,务必用模式匹配区分。
  3. 配置位置写错—— 钩子必须写在config :addict,配置块内,而不是应用自己的配置块中;生成配置后先确认文件里已有:addict段。

小结:Addict 后置操作钩子 5 个配置 + 1 套签名

  • 5 个钩子post_registerpost_loginpost_logoutpost_recover_passwordpost_reset_password
  • 统一签名(conn, status, params) -> conn
  • 成功拿到用户模型,失败拿到错误列表,用模式匹配分流
  • 不配置即不启用,配置后立即生效

post_login开始接第一个钩子,跑通后再逐个补齐其余四个,你的 Phoenix 应用就拥有了完整的用户行为扩展点。🎉

【免费下载链接】addictUser management lib for Phoenix Framework项目地址: https://gitcode.com/gh_mirrors/add/addict

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询