您确实可以使用 select 检查身份验证
t=# select 'md5'||md5('somePass'||usename) = passwd from pg_shadow where usename = 'web';
?column?
----------
t
(1 row)
但您不应直接操作pg_authid,而应使用 SQL 语句,例如:
t=# create user web password 'somePass';
CREATE ROLE
或
t=# alter user web password 'anotherP';
ALTER ROLE
t=# select 'md5'||md5('somePass'||usename) = passwd from pg_shadow where usename = 'web';
?column?
----------
f
(1 row)
t=# select 'md5'||md5('anotherP'||usename) = passwd from pg_shadow where usename = 'web';
?column?
----------
t
(1 row)
和:
t=# drop user web;
DROP ROLE
t=# select 'md5'||md5('anotherP'||usename) = passwd from pg_shadow where usename = 'web';
?column?
----------
(0 rows)
为了避免 SU 角色与应用程序,只需为帐户操作创建包装,例如:
t=# create or replace function adduser(_u text,_p text) returns boolean as $$
begin
execute format('create user %I password %L',_u,_p);
return true;
end;
$$ language plpgsql security definer;
CREATE FUNCTION
安全定义器将允许应用用户创建新角色:
t=# select adduser('web','newP');
adduser
---------
t
(1 row)
t=# select 'md5'||md5('newP'||usename) = passwd from pg_shadow where usename = 'web';
?column?
----------
t
(1 row)
不要忘记添加一些逻辑和异常,这样应用程序就不会干扰现有的 SU 角色(不丢弃、不更改密码)。
最后,我认为这样的想法可能很危险。在实施之前进行规划...