我建立在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” RECORD(此失败, Error 42501
当Web应用程序连接到数据库中作为新创建的用户)
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
,我仍然得到同样的“权限被拒绝”的错误。
所以,现在的问题是这样的:我俯瞰什么? 我觉得我已经约的权限设置每种排列测试,但我已经很明显错过了在这个过程中的东西。 谢谢你的帮助。