拦截登录/注销 ejabberd

Posted

技术标签:

【中文标题】拦截登录/注销 ejabberd【英文标题】:Intercept login/logout ejabberd 【发布时间】:2012-01-13 14:34:30 【问题描述】:

我想知道用户何时从自定义模块中的 ejabberd 会话登录和注销,而不更改 ejabberd 代码。

我需要它,因为我必须在用户登录时执行一些操作并清理我在用户注销时执行的操作。此外,在某些情况下,我需要能够注销用户。

那么,有没有办法扩展一些模块来获得这些功能?我仍在寻找一些可以帮助我的文档。

【问题讨论】:

使用 ejabberd 钩子,process-one.net/en/wiki/ejabberd_events_and_hooks。你需要 user_available_hook、set_presence_hook 和 unset_presence_hook 'user_available_hook' 有什么作用?我知道使用 set_presence 和 unset_presence 我可以在用户登录或注销(以及其他事件)时获取事件。这个 user_available 呢? 【参考方案1】:

您可以编写自己的代码,并使用 ejabberd 为您提供的行为 gen_mod 构建它。 一个不错的起点是blog/tutorial,然后关注next part。 这应该足够了,但您会在同一个博客上找到更多内容。

在您对构建自己的模块更加熟悉之后,我建议您看看钩子 set_presence_hookunset_presence_hook

请注意,每次设置状态时都会激活 set_presence_hook,而不仅仅是在登录时,如果可以的话,您只需要解决这个问题。

长话短说,你最终会得到类似下面的东西

-module(mod_your_mod).

-behavior(gen_mod).
-include("ejabberd.hrl").

-export([start/2, stop/1, on_set/4, on_unset/4]).

start(Host, _Opts) ->
   ejabberd_hooks:add(set_presence_hook, Host, ?MODULE, on_set, 50),
   ejabberd_hooks:add(unset_presence_hook, Host, ?MODULE, on_unset, 50),
   ok.

stop(Host) ->
   ejabberd_hooks:delete(set_presence_hook, Host, ?MODULE, on_set, 50),
   ejabberd_hooks:delete(unset_presence_hook, Host, ?MODULE, on_unset, 50),
   ok.

on_set(User, Server, _Resource, _Packet) ->
<presence code>    

on_unset(User, Server, _Resource, _Packet) ->
<offline code>

希望有帮助

【讨论】:

知道为什么 set_presence_hook 会被触发两次吗? @nuno-freitas 钩子不是 user_available_hook 是正确的钩子吗?

以上是关于拦截登录/注销 ejabberd的主要内容,如果未能解决你的问题,请参考以下文章

springboot注销30天后清除数据怎么实现

Springboot 使用 SaToken 进行登录认证权限管理以及路由规则接口拦截

SpringBoot:Demo

如果有 401 响应,角度拦截器会注销应用程序吗?

Spring-Security权限管理框架——根据角色权限登录

SMBMS超市订单管理系统