如何使用postgres角色和密码进行网站身份验证

时间:2017-12-05 08:47:14

标签: postgresql passwords password-encryption postgresql-9.6

我希望未来的Web应用程序的用户能够使用他们的网站用户名和密码登录postgres数据库。

该网站将使用特殊用户名(例如“网络”)连接到postgres,该用户名将不可用作网站用户名。 (如“postgres”等)。

尚未存在用户或密码,因此没有迁移问题。所有网站用户都将是postgres用户。该网站可以哈希密码,但postgres。

以最少的数据重复实现这一目标的最明智的方法是什么?

我可以使用/扩展postgres的内部角色表作为用户名/密码身份验证的一般来源吗?即我需要能够运行一个查询,告诉我给定的用户名/密码组合是否有效。

或者是否更好地拥有一个单独的网站用户名和密码存储,并以某种方式获得postgres使用它?

2 个答案:

答案 0 :(得分:2)

您确实可以通过选择

来检查身份验证
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角色(不是删除,不更改密码)进行干涉。

最后,我认为这样的想法可能很危险。在实施之前计划......

答案 1 :(得分:0)

我发现https://www.postgresql.org/docs/9.6/static/catalog-pg-authid.html写了一篇pg_authid表,其中包含用户名和md5哈希password || username

当我创建了一个可以更新此表的用户时,我希望能够将其用于网站登录。它限制我使用md5,这并不理想。