Ошибка PostgreSQL 42501: разрешение отклонено для схемы

Вопрос:

Я создаю систему регистрации пользователей в ASP.NET с базой данных PostgreSQL, чтобы поддерживать пользовательскую информацию. В рамках процесса регистрации пользователю отправляется подтверждающее сообщение, в котором они должны щелкнуть ссылку, чтобы подтвердить свой адрес электронной почты. Затем они переносят их на страницу, где они могут создать свой пароль.

После того как пользователь предоставит пароль, соответствующий некоторым основным критериям безопасности, веб-приложение запускает несколько хранимых процедур (функций) PostgreSQL, чтобы сначала создать роль пользователя в базе данных и поместить их в группу пользователей, а затем создать запись в базу данных с информацией о пользователе (имя и фамилия, адрес электронной почты и т.д.).

Первая из этих хранимых процедур – та, которая создает роль пользователя – выполняется просто отлично. Затем приложение отключается от базы данных и повторно подключается как вновь созданный пользователь для запуска второй хранимой процедуры для создания записи профиля. Тем не менее, это приложение не работает, возвращая вышеупомянутую ошибку 42501: Permission denied for schema...

Я подтвердил, что группе пользователей, в которой создается новый пользователь, было предоставлено разрешение USAGE на схему и перешло все разрешения для каждого из затронутых объектов в базе данных (таблица профилей и хранимая процедура), и все выглядит правильно, но я не могу заставить свое веб-приложение создать новую запись профиля.

Для справки, вот две хранимые процедуры (отредактированы):

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) СОЗДАТЬ ЗАПИСЬ “ПРОФИЛЬ” (эта Error 42501 не выполняется с 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, я все равно получаю ту же ошибку “отказа в разрешении”.

Итак, теперь вопрос заключается в следующем: что я пропускаю? Я чувствую, что я тестировал каждую перестановку настроек разрешений, но я, очевидно, пропустил что-то в этом процессе. Спасибо за вашу помощь.

Лучший ответ:

Кажется, я получил работу. Я просмотрел все настройки разрешений в схеме, за исключением того, что на этот раз я снова прошел через все “Привилегии по умолчанию”. Я установил, что группа “системные пользователи” имеет SELECT для таблиц и последовательностей, EXECUTE для функций и USAGE по типам. Когда я снова проверил, моя хранимая процедура выполнялась правильно и создала мою запись профиля в базе данных, как и ожидалось.

Поэтому, видимо, я пропустил что-то весьма важное. Даже со всеми индивидуальными настройками прав, которые я назначил для определенных объектов, эти привилегии по умолчанию все еще не были установлены так, как они должны были быть. Урок выучен.

Оцените статью
TechArks.Ru
Добавить комментарий