当前位置: 首页 > news >正文

Guardian与GuardianDb集成:实现令牌追踪与数据库管理

Guardian与GuardianDb集成:实现令牌追踪与数据库管理

【免费下载链接】guardianElixir Authentication项目地址: https://gitcode.com/gh_mirrors/gu/guardian

在Elixir生态系统中,Guardian身份验证框架是构建安全应用的基石。作为一款强大的Elixir身份验证解决方案,Guardian提供了完整的JWT令牌管理机制,但默认情况下,它并不跟踪已颁发的令牌状态。这就是GuardianDb集成发挥作用的地方,它为Guardian添加了数据库级别的令牌追踪功能,实现了真正的令牌撤销和状态管理。

为什么需要令牌追踪? 🔍

默认的JWT令牌是无状态的,这意味着一旦令牌被颁发,应用程序就无法主动撤销它,只能等待令牌自然过期。这在很多安全敏感的场景下是不够的:

  • 用户主动退出时需要立即使令牌失效
  • 检测到可疑活动时需要强制撤销令牌
  • 需要管理用户的会话状态
  • 实现设备级别的访问控制

GuardianDb通过将令牌信息存储在数据库中,解决了这些问题。它会记录每个颁发的令牌,并在每次访问时验证令牌是否仍然有效。

Guardian的回调机制

Guardian提供了灵活的回调系统,允许你在身份验证生命周期的不同阶段插入自定义逻辑。这些回调是GuardianDb集成的基础:

  • on_verify- 在令牌验证成功后调用
  • on_revoke- 在令牌撤销时调用
  • build_claims- 构建令牌声明时调用
  • verify_claims- 验证令牌声明时调用

在lib/guardian.ex中,Guardian定义了完整的回调接口:

@callback on_revoke( claims :: Guardian.Token.claims(), token :: Guardian.Token.token(), options :: Guardian.options() ) :: {:ok, Guardian.Token.claims()} | {:error, any}

GuardianDb的工作原理

GuardianDb通过实现Guardian的回调函数来工作:

  1. 令牌颁发时:将新令牌记录到数据库
  2. 令牌验证时:检查令牌是否在数据库中被标记为有效
  3. 令牌撤销时:在数据库中标记令牌为无效

这种集成方式非常优雅,因为GuardianDb不需要修改Guardian的核心代码,只需要实现相应的回调接口即可。

配置GuardianDb集成

要使用GuardianDb,你需要在项目中添加依赖并进行配置:

首先,在mix.exs中添加依赖:

defp deps do [ {:guardian, "~> 2.0"}, {:guardian_db, "~> 3.0"} ] end

然后,在你的Guardian实现模块中配置回调:

defmodule MyApp.Guardian do use Guardian, otp_app: :my_app # 其他配置... def on_verify(claims, token, opts) do GuardianDb.on_verify(claims, token, opts) end def on_revoke(claims, token, opts) do GuardianDb.on_revoke(claims, token, opts) end end

数据库迁移

GuardianDb需要数据库表来存储令牌信息。典型的迁移文件如下:

defmodule MyApp.Repo.Migrations.CreateGuardianDbTokens do use Ecto.Migration def change do create table(:guardian_tokens, primary_key: false) do add :jti, :string, primary_key: true add :aud, :string add :typ, :string add :iss, :string add :sub, :string add :exp, :bigint add :jwt, :text add :claims, :map timestamps() end create index(:guardian_tokens, [:aud]) create index(:guardian_tokens, [:sub]) create index(:guardian_tokens, [:exp]) end end

令牌生命周期管理

1. 令牌颁发与存储

当用户登录时,Guardian颁发令牌,GuardianDb会自动将令牌信息保存到数据库:

# 用户登录 {:ok, token, claims} = MyApp.Guardian.encode_and_sign(user) # GuardianDb自动记录到数据库 # 包含:jti(令牌ID)、sub(用户ID)、exp(过期时间)、claims等

2. 令牌验证与检查

每次请求验证令牌时,GuardianDb会检查数据库中的令牌状态:

# 验证令牌 {:ok, claims} = MyApp.Guardian.decode_and_verify(token) # GuardianDb检查: # 1. 令牌是否在数据库中 # 2. 令牌是否被撤销 # 3. 令牌是否过期

3. 令牌撤销

当用户退出或管理员撤销令牌时:

# 撤销令牌 {:ok, claims} = MyApp.Guardian.revoke(token) # GuardianDb在数据库中标记令牌为无效 # 后续验证将失败

高级功能

会话管理

通过GuardianDb,你可以实现完整的会话管理:

# 获取用户的所有活动会话 active_sessions = GuardianDb.Token |> where([t], t.sub == ^user_id) |> where([t], t.exp > ^DateTime.utc_now()) |> Repo.all()

设备管理

追踪每个设备的令牌:

# 颁发令牌时添加设备信息 claims = %{"device_id" => device_id, "device_type" => "mobile"} {:ok, token, _} = MyApp.Guardian.encode_and_sign(user, claims)

批量撤销

撤销用户的所有令牌:

# 撤销用户的所有令牌 GuardianDb.revoke_all_tokens_for_user(user_id)

性能考虑

虽然数据库查询会增加一些开销,但GuardianDb进行了优化:

  1. 索引优化:在关键字段上创建索引
  2. 缓存策略:可配置缓存以减少数据库查询
  3. 清理任务:定期清理过期令牌

安全最佳实践

  1. 定期清理过期令牌:设置定时任务清理数据库中的过期令牌
  2. 监控异常活动:记录令牌验证失败和撤销事件
  3. 实现速率限制:防止暴力破解令牌
  4. 使用HTTPS:确保令牌传输安全

总结

Guardian与GuardianDb的集成为Elixir应用提供了完整的令牌管理解决方案。通过将无状态的JWT令牌与有状态的数据库记录相结合,你可以在保持JWT优点的同时,获得令牌撤销和状态管理的能力。

这种集成方式体现了Elixir社区的模块化设计哲学——通过实现标准的回调接口,GuardianDb能够无缝地扩展Guardian的功能,而不需要修改核心代码。

无论你是构建需要严格安全控制的金融应用,还是需要精细会话管理的社交平台,GuardianDb集成都能为你提供所需的工具和灵活性。通过合理的配置和最佳实践,你可以构建出既安全又高效的身份验证系统。

【免费下载链接】guardianElixir Authentication项目地址: https://gitcode.com/gh_mirrors/gu/guardian

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

http://www.jsqmd.com/news/513761/

相关文章:

  • 查重高不是你抄的,是表达太“标准”!百考通智能降重,让原创被系统看见
  • 终极指南:AutoBangumi ORM优化实战——SQLAlchemy查询性能调优全攻略
  • 终极指南:使用Awesome React Components实现性能监控与用户体验指标追踪
  • WEB扫描器Invicti-Professional-V26.30.0(自动化爬虫扫描)更新
  • Spring事务@Transactional失效的8种隐蔽陷阱与实战避坑指南
  • MangoHud字体安装指南:确保自定义字体可用的完整教程
  • 利用LangGraph实现RAG
  • Qwen2-VL-2B-Instruct效果对比:与传统计算机视觉方法在目标描述上的差异
  • 嵌入式XIP技术原理与SPI NOR Flash工程实现
  • 终极指南:如何利用Kyverno实现Kubernetes策略覆盖率与合规率的全面分析
  • 本月推荐:行业内优质防爆危废间产品评测,危废间/危废暂存间/防爆危废间,防爆危废间制造厂家口碑分析 - 品牌推荐师
  • 揭秘StreamingLLM核心技术:evict_for_space函数如何实现高效缓存管理
  • UEFI设备路径数据库:常见设备路径示例与说明
  • 嵌入式硬件开源项目技术文章输入规范说明
  • SUPER COLORIZER实战:利用Anaconda快速创建独立Python环境
  • 简单指南:如何在Linux上使用Waydroid快速运行Android应用
  • ESP32驱动BLE112模块的BGAPI通信实践指南
  • 基于STM32的博物馆展柜四维环境监控终端设计
  • 如何快速搭建Shenyu网关分布式追踪系统:整合Zipkin完整指南
  • DAMO-YOLO惊艳效果集:80类COCO目标在复杂光照下的识别作品展
  • WinFsp终极指南:Windows用户态文件系统的10个高性能优化技巧
  • 5-顶刊复现:基于Lyapunov的MPC方法与水下机器人AUV路径跟踪trajectory ...
  • SPI ENC硬件加密驱动设计与存储安全适配
  • 【2026年最新600套毕设项目分享】基于web的数学库组卷系统(14215)
  • Qwen-Image-Edit真实案例分享:看看这些“一句话修图”的惊艳效果
  • fd输出模块深度解析:终极格式化输出与颜色渲染指南 [特殊字符]
  • Keyviz在教育领域的终极应用:如何为培训机构打造定制化教学解决方案
  • Qwen3-ASR-0.6B效果实测:复杂环境语音识别,依然清晰
  • 终极指南:如何使用Skia实现惊艳的图像运动模糊效果
  • 基于PI+重复控制的三相APF仿真系统:特点与应用