我希望将来的Web应用程序的用户能够使用其网站用户名和密码登录Postgres数据库。
该网站将使用特殊用户名(例如" Web")连接到Postgres,该用户名将不可用作网站用户名。(就像" Postgres"等一样)
尚无用户或密码,因此没有迁移问题。所有网站用户将是Postgres用户。该网站可以哈希密码,但是Postgres确实可以。
通过数据重复最少,实现此目的的最明智的方法是什么?
我可以使用/扩展Postgres的内部角色表作为用户名/密码身份验证的一般来源吗?即,我需要能够运行查询,这将告诉我给定的用户名/密码组合是否有效。
或者有一个单独的网站用户名和密码商店更好,并且以某种方式让Postgres使用此?
您确实可以使用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)
要避免使用应用程序的角色,只需为帐户操作创建包装纸,例如:
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角色相互互动(不下垂,不更改密码)。
最后,我认为这样的想法可能很危险。在实施之前计划它...
我找到了https://www.postgresql.org/docs/9.6/static/static/catalog-pg-authid.html,其中包含pg_authid表,其中包含username和md5password || username
的哈希
我创建了一个可以更新此表的用户时,我希望能够将其用于网站登录。它限制了我使用MD5,这不是不理想的。