我将数据库和会话数据中的权限数据存储在内存/文件系统中。我将处理后的每个用户权限存储在会话数据中。我想在数据库中更改用户权限后刷新该权限缓存。由于角色权限,用户额外权限和权限详细信息的更改,用户权限可能会更改。因此,有很多存储过程可能导致用户权限更改。我可以收集该用户的列表,但我该如何发回? (我已经使用返回值发回记录等等)。
回答“我不确定您的具体要求:我应该如何回复?请说明并添加一个代码示例(即使它不起作用)。< / EM>“
我将会话数据存储在内存或文件系统中,并将用户权限存储在数据库中。授权逻辑非常复杂,因此通过成功的身份验证,我收集用户拥有的每个权限,使用自定义解析器解析它,并将结果作为缓存保存到会话中。之后,我通过权限检查使用该缓存。问题是通过权限更改,角色更改,角色权限更改,角色成员身份更改等等...我必须更新会话中的权限缓存。
带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没有太多经验......
答案 0 :(得分:0)
1)
LISTEN和NOTIFY将是最好的解决方案,但我的驱动程序(php pdo驱动程序)遗憾地不支持它,我认为它永远不会,因为这是postgres特定的功能。
2)。
我认为我的驱动程序是使用临时表的唯一选择。我为此创建了以下函数:
初始化
CREATE FUNCTION policy_change_provide_store ()
RETURNS VOID
AS
$BODY$
BEGIN
CREATE TEMPORARY TABLE policy_change (
user_id INT4
);
EXCEPTION WHEN duplicate_table THEN
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
更新
CREATE FUNCTION policy_change_update (
IN user_ids INT4 []
)
RETURNS VOID
AS
$BODY$
BEGIN
PERFORM policy_change_provide_store();
INSERT INTO policy_change
SELECT inserted_user_id FROM unnest(user_ids) AS inserted_user_id
WHERE NOT EXISTS(SELECT 1 FROM policy_change WHERE user_id = inserted_user_id);
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
读
CREATE FUNCTION user_read_all_by_policy_change ()
RETURNS TABLE (
user_id INT4
)
AS
$BODY$
BEGIN
PERFORM policy_change_provide_store();
RETURN QUERY
SELECT policy_change.user_id FROM policy_change ORDER BY policy_change.user_id DESC;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
因此,我使用policy_change_update(user_ids)
从我的postgres函数更新策略更改数据,并使用user_read_all_by_policy_change()
从http服务器中读取该数据。是的,这很难看,但效果很好。如果您有更好的解决方案,请告诉我们!