Это не совсем ответ на вопрос, который вы задаете, но недавно мне пришлось сделать нечто подобное, и я сделал это с помощью представления и правил вместо триггеров.Я надеюсь, что это полезно, несмотря на то, что я не являюсь ответом на вопрос, который вы задали напрямую.
Вот моя таблица пользователей и представление:
CREATE TABLE users_t (
username VARCHAR(16) PRIMARY KEY,
email VARCHAR UNIQUE,
password CHAR(60),
salt CHAR(29)
);
CREATE VIEW users AS SELECT username, email, '********'::varchar AS password FROM users_t;
Правило вставки заботится о генерации солизначение:
CREATE RULE users_insert_rule AS ON INSERT TO users DO INSTEAD
INSERT INTO users_t (username, email, password, salt)
SELECT new.username, new.email, crypt(new.password, salt.salt), salt.salt
FROM (SELECT gen_salt('bf') as salt) salt
RETURNING username, email, '********'::varchar;
Для полноты картины я включаю правила обновления и удаления, хотя они не особенно актуальны:
CREATE RULE users_update_rule AS ON UPDATE TO users DO INSTEAD
UPDATE users_t
SET
username = new.username,
email = new.email,
password = crypt(new.password, salt)
RETURNING username, email, '********'::varchar;
CREATE RULE users_delete_rule AS ON DELETE TO users DO INSTEAD
DELETE FROM users_t WHERE username = old.username
RETURNING username, email, '********'::varchar;
Затем я написал функцию аутентификации, которая позаботитсяиспользования соли:
CREATE OR REPLACE FUNCTION authenticate(varchar, varchar) RETURNS setof users AS $$
SELECT * FROM users
WHERE username =
(SELECT username FROM users_t
WHERE username = $1 AND crypt($2, salt) = password)
$$ LANGUAGE sql;
Таким образом, вы можете войти в систему, запросив SELECT * FROM authenticate('username', 'password');
, и ваши пользователи будут созданы путем вставки в представление users
.Вы можете установить разрешения таким образом, чтобы у вас была непривилегированная роль, которая может видеть представление пользователей, но не базовую таблицу users_t.Таким образом, вы можете легко взаимодействовать с таблицей пользователей с посоленными паролями, не имея дело с солью в приложении.