【发布时间】:2013-09-16 14:32:26
【问题描述】:
我将权限数据存储在数据库中,将会话数据存储在内存/文件系统中。我将每个用户的权限处理形式存储在会话数据中。我想在数据库中更改用户权限后刷新该权限缓存。由于角色权限、用户额外权限和权限详细信息的更改,用户权限可能会发生变化。所以有很多存储过程会导致用户权限的改变。我可以收集该用户的列表,但我应该如何将其发回? (我已经使用返回值发回记录等...)
回答“我不确定您到底在问什么:我应该如何将其寄回?请澄清并添加一个代码示例(即使它不起作用)。"
我将会话数据存储在内存或文件系统中,并将用户权限存储在数据库中。授权逻辑非常复杂,因此通过成功的身份验证,我收集用户拥有的每个权限,使用自定义解析器对其进行解析,并将结果作为缓存保存到会话中。之后,我通过权限检查使用该缓存。问题是通过权限更改、角色更改、角色权限更改、角色成员资格更改等...我必须更新会话中的权限缓存。
带有 REST 接口的简化版本:
POST /sessions {email: "", password: ""}
-> {token: "qwerty", user: {id: 123}}
-> sessionStore.create("qwerty", {user: {id: 123}, permissions: "abcd"})
POST /roles {name: "administrator", permissions: "efgh"}
-> {id: 567}
POST /roleMmembership {user: {id: 123}, role: {id: 567}}
-> {id: 890}
-> sessionStore.update("qwerty", {user: {id: 123}, permissions: "abcdefgh"})
正如您所见,在我将用户 123 添加到角色 567 后,会话已更新,并且权限“efgh”已添加到会话权限缓存中。在数据库级别,新成员调用添加成员的存储过程,并返回 id。我可以在此过程中看到哪个用户有权限更改,但我无法发回该信息,因为存储过程只能有一个返回值。使用 notify 发送该信息是一个好主意,因为它应该更像一个事件而不是返回值。可悲的是,在我的数据库驱动程序中,不支持通知,我不想更改驱动程序......所以我需要一个解决方法。它可能是多个返回值、全局变量等...我认为使用临时表是唯一可能的解决方案,但我对 postgres 没有太多经验...
【问题讨论】:
-
你试过
LISTEN和NOTIFY吗? -
我不确定驱动程序是否支持。它是 php 5.3 PDO pgsql 驱动程序。
-
如果没有,您可以尝试使用其他驱动程序/语言创建一个小型“侦听器”应用程序,以通知您的主应用程序。或者使用 PL/PHP、PL/Python、PL/V8 或任何其他语言在 DB 中编写存储过程来向您的应用发送消息。
-
目前的项目很遗憾我没有这些选项。顺便说一句,这是个好主意。我想我会尝试临时表。
-
我不确定你到底在问什么:
How should I send it back?。请澄清并添加一个代码示例(即使它不起作用)。
标签: php postgresql pdo plpgsql postgresql-8.4