Обсуждение: What hook would you recommend for "one time, post authentication"?

Поиск
Список
Период
Сортировка

What hook would you recommend for "one time, post authentication"?

От
Daniel Farina
Дата:
What hook would you recommend that matches this criteria:

* Runs post-authentication

* ..Once

I was putting together a little extension module[0] intended to do
connection limits out-of-band with the catalog (so that hot standbys
and primaries can have different imposed connection limits), but am
stymied because I can't locate a hook matching this description.

My general approach has been to try to use
GetUserNameFromId(GetSessionUserId()), but this requires
InitializeSessionUserId be called first, and that has been causing me
some trouble.

ClientAuthentication_hook is too early (authentication has not yet
happened, InitializeSessionUserId has not been called).  Many of the
other hooks are run per query (like the Executor hooks).  And,
postinit.c is not giving me a lot of clues here and nothing with the
lexeme 'hook' is giving me a lot of confidence as seen in
typedefs.list/grep.

I appreciate any advice one can supply, thank you.

[0]: https://github.com/fdr/pg_connlimit



Re: What hook would you recommend for "one time, post authentication"?

От
Tom Lane
Дата:
Daniel Farina <daniel@heroku.com> writes:
> What hook would you recommend that matches this criteria:
> * Runs post-authentication

> * ..Once

ClientAuthentication_hook

> My general approach has been to try to use
> GetUserNameFromId(GetSessionUserId()), but this requires
> InitializeSessionUserId be called first, and that has been causing me
> some trouble.

So don't do that.  The HBA code uses 
roleid = get_role_oid(port->user_name, true);

and actually if you just want the string form you could use
port->user_name without any extra pushups (bearing in mind that
it might or might not be a valid user name).
        regards, tom lane



Re: What hook would you recommend for "one time, post authentication"?

От
Daniel Farina
Дата:
On Mon, Oct 28, 2013 at 6:27 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>         roleid = get_role_oid(port->user_name, true);

Thank you for that, that appears to work very well to my purpose, as
does ClientAuthentication_hook, now.