【问题标题】:How can I use postgres roles and passwords for website authentication如何使用 postgres 角色和密码进行网站身份验证
【发布时间】:2018-05-18 20:47:15
【问题描述】:

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

该网站将使用一个特殊的用户名(例如“web”)连接到 postgres,该用户名将不能用作网站用户名。 (就像“postgres”等一样)

尚不存在用户或密码,因此不存在迁移问题。所有网站用户都是 postgres 用户。该网站可以散列密码,但 postgres 可以。

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

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

或者有一个单独的网站用户名和密码存储并以某种方式让 postgres 使用它更好?

【问题讨论】:

    标签: postgresql passwords password-encryption postgresql-9.6


    【解决方案1】:

    您确实可以使用 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 角色(不丢弃、不更改密码)。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 2020-02-28
        • 2020-03-20
        相关资源
        最近更新 更多