0

如何根据用户的电子邮件地址判断用户是否使用直接 SQL 登录?

我们有一个与 ExpressionEngine 高度耦合的系统,并且无法在许多 EE 模板中使用 Magento API。

编辑以显示当前登录代码:

Mage::getSingleton('core/session', array('name'=>'frontend'));
$session = Mage::getSingleton('customer/session');
$session->login($ParticipantInfo['PreferedEmailAddress'],'default_password');
$session->setCustomerAsLoggedIn($session->getCustomer());
4

1 回答 1

1

TL;DR:据我所知,即使会话数据存储在数据库中,也没有明确的方法可以仅通过普通 SQL 进行判断。

问题也将是:哪个用户?客户、管理员还是 api 用户?假设您将会话数据存储在文件系统中,我可以想到一些选项:

API

对于 API 用户,请查看该api_session表,您可以与api_user存储电子邮件地址的表进行连接。但是,没有办法,这两个表中的信息就足够了,因为只有会话 id 和 logdate 被保存为特定的用户 id,并且您无法判断会话是否仍然处于活动状态。

查询这些数据可能类似于以下内容:

SELECT * 
    FROM api_user 
INNER JOIN api_session ON api_user.user_id = api_session.user_id
WHERE api_user.email = "<known_email>"

管理员和客户

管理员用户存储在 中admin_user,但是,与 for 一样api_user,不会存储任何信息用于会话管理。

客户存储在customer_*表中。log_visitor您可以在表格中查找它们:

SELECT * 
    FROM log_visitor_online
INNER JOIN customer_entity ON customer_entity.entity_id = log_visitor_online.customer_id
WHERE c.email = "<known_email>"

同样,如果会话仍然有效,则无法检索到任何信息。编辑:蒂姆在他的回答中展示了如何正确地做到这一点。

总体而言,坏消息

如果用户当前登录,则不会直接存储任何信息,仅在会话创建日期时。使用开箱即用的功能,您应该无法通过 SQL 准确判断用户当前是否登录 - 这充其量是不明智的,因为 magento 会根据数据库中存储的会话数据检查用户会话的有效性/filesystem,因此如果没有用户的会话数据,您就无法 100% 准确地确定任何内容。

如果您可以编写模块,那是个好消息

通过一些工作,您可以连接到 Magento 的会话管理。核心附带的事件有一张备忘单。您还可以创建自己的自定义事件,您可以在这些事件上收听和执行代码。

这里的想法是编写一个模块,该模块可以存储有关客户(管理员或 api 用户反之亦然)或额外模块表中的额外信息。您可以挂钩登录过程并为 api_user/customer/admin 设置一个时间戳,并根据请求刷新该时间戳。如果一个用户的时间戳没有被刷新,比如说,X 秒,你假设用户已经登录了。您在注销事件时删除用户的时间戳。

但是,这也不是 100% 准确的,它在很大程度上取决于用户在您的系统中所做的事情。

无论如何,我希望我能提供一些见解。

lg,

弗洛

于 2012-07-23T20:55:56.153 回答