あなたは確かに選択
t=# select 'md5'||md5('somePass'||usename) = passwd from pg_shadow where usename = 'web';
?column?
----------
t
(1 row)
で認証を確認することができますが、あなたは代わりにSQL文を使用して、直接pg_authid
を操作することはできません、のような:
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)
のように、単に、アカウントの操作のためのwrapupsを作成し、アプリケーションとSUの役割を回避するために:セキュリティ定義は、新しい役割を作成するために、アプリのユーザーをALOWます
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ロール(パスワードを変更しないdropppingではない)と相互作用しません。
最後に、このような考えは危険だと思います。実装する前に計画してください。