PostgreSQL错误42501:模式的权限被拒绝

时间:2014-07-23 14:14:56

标签: asp.net postgresql stored-procedures permissions

我正在ASP.NET中使用PostgreSQL数据库构建用户注册系统来维护用户信息。作为注册过程的一部分,向用户发送确认消息,他们必须在该确认消息中单击该链接以验证其电子邮件地址。然后将它们带到可以创建密码的页面。

一旦用户提供了满足一些基本安全标准的密码,Web应用程序就会运行几个PostgreSQL存储过程(函数),首先在数据库中创建用户角色并将它们放入用户组,然后创建一个使用用户的“个人资料”详细信息(姓名,电子邮件地址等)记录在数据库中。

这些存储过程中的第一个 - 创建用户角色的程序 - 运行得很好。然后,应用程序断开与数据库的连接,并重新连接为新创建的用户,以运行第二个存储过程来创建配置文件记录。但是,这是应用程序失败的地方,返回上面提到的错误42501: Permission denied for schema...

我已经验证了正在创建新用户的用户组已获得架构的USAGE权限,并且已经检查了数据库中每个受影响对象的所有权限(配置文件)表和存储过程),一切看起来都正确,但我无法让我的Web应用程序创建新的“配置文件”记录。

供参考,以下是两个存储过程(编辑):

1)创建数据库用户角色(这样可以正常运行并创建用户)

CREATE OR REPLACE FUNCTION "SP_CreateUser"("User" character varying, "Pass" character varying)
  RETURNS boolean AS
$BODY$DECLARE success boolean;
BEGIN
EXECUTE 'CREATE USER ' || quote_ident($1) || ' PASSWORD ' || quote_literal($2);
EXECUTE 'GRANT systemusers TO ' || quote_ident($1);
SELECT pg_roles.rolname = $1 INTO success FROM pg_roles WHERE pg_roles.rolname = $1;
RETURN success;
END$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
ALTER FUNCTION "SP_CreateUser"(character varying, character varying)
  OWNER TO administrators;
GRANT EXECUTE ON FUNCTION "SP_CreateUser"(character varying, character varying) TO administrators;
GRANT EXECUTE ON FUNCTION "SP_CreateUser"(character varying, character varying) TO systemusers;
REVOKE ALL ON FUNCTION "SP_CreateUser"(character varying, character varying) FROM public;

2)创建“PROFILE”记录(当Web应用程序以新创建的用户身份连接到数据库时,这会失败Error 42501

CREATE OR REPLACE FUNCTION website."SP_CreateProfile"("EmailAddress" character varying, "FirstName" character varying, "LastName" character varying, "PhoneNumber" character varying)
  RETURNS boolean AS
$BODY$DECLARE success boolean;
BEGIN
INSERT INTO website.profiles ("UserEmail", "FirstName", "LastName", "AdministrativeUser", "Active", "PhoneNumber")
VALUES ($1, $2, $3, FALSE, TRUE, $4);
SELECT p."UserEmail" = $1 INTO success FROM website.profiles p WHERE p."UserEmail" = $1;
RETURN success;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying)
  OWNER TO administrators;
GRANT EXECUTE ON FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying) TO administrators;
GRANT EXECUTE ON FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying) TO systemusers;
REVOKE ALL ON FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying) FROM public;

您可能会注意到我没有使用SECURITY DEFINER设置第二个存储过程。这是故意的,因为我更喜欢使用个人安全凭证运行的功能。但是,在我的测试中,即使我已启用SECURITY DEFINER,我仍然会收到相同的“权限被拒绝”错误。

所以,现在的问题是:我在俯瞰什么?我觉得我已经测试了许可设置的每个排列,但我显然在这个过程中遗漏了一些东西。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我似乎已经开始工作了。我回顾了架构上的所有权限设置,除了这次我还回顾了所有“默认权限”。我将“systemusers”组设置为对表和序列SELECT,对函数EXECUTE和类型USAGE。当我再次测试时,我的存储过程正确运行并按预期在数据库中创建了我的配置文件记录。

所以,显然我 DID 忽视了一些非常重要的东西。即使我已经在特定对象上分配了所有单独的权限设置,这些默认权限仍然没有按照他们需要的方式设置。经验教训。