mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Add option to bgworkers to allow the bypass of role login check
This adds a new option called BGWORKER_BYPASS_ROLELOGINCHECK to the
flags available to BackgroundWorkerInitializeConnection() and
BackgroundWorkerInitializeConnectionByOid().
This gives the possibility to bgworkers to bypass the role login check,
making possible the use of a role that has no login rights while not
being a superuser. PostgresInit() gains a new flag called
INIT_PG_OVERRIDE_ROLE_LOGIN, taking advantage of the refactoring done in
4800a5dfb4.
Regression tests are added to worker_spi to check the behavior of this
new option with bgworkers.
Author: Bertrand Drouvot
Reviewed-by: Nathan Bossart, Michael Paquier, Bharath Rupireddy
Discussion: https://postgr.es/m/bcc36259-7850-4882-97ef-d6b905d2fc51@gmail.com
This commit is contained in:
@@ -725,7 +725,7 @@ has_rolreplication(Oid roleid)
|
||||
* Initialize user identity during normal backend startup
|
||||
*/
|
||||
void
|
||||
InitializeSessionUserId(const char *rolename, Oid roleid)
|
||||
InitializeSessionUserId(const char *rolename, Oid roleid, bool bypass_login_check)
|
||||
{
|
||||
HeapTuple roleTup;
|
||||
Form_pg_authid rform;
|
||||
@@ -789,7 +789,7 @@ InitializeSessionUserId(const char *rolename, Oid roleid)
|
||||
/*
|
||||
* Is role allowed to login at all?
|
||||
*/
|
||||
if (!rform->rolcanlogin)
|
||||
if (!bypass_login_check && !rform->rolcanlogin)
|
||||
ereport(FATAL,
|
||||
(errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
|
||||
errmsg("role \"%s\" is not permitted to log in",
|
||||
|
||||
@@ -684,6 +684,7 @@ BaseInit(void)
|
||||
* flags:
|
||||
* - INIT_PG_LOAD_SESSION_LIBS to honor [session|local]_preload_libraries.
|
||||
* - INIT_PG_OVERRIDE_ALLOW_CONNS to connect despite !datallowconn.
|
||||
* - INIT_PG_OVERRIDE_ROLE_LOGIN to connect despite !rolcanlogin.
|
||||
* out_dbname: optional output parameter, see below; pass NULL if not used
|
||||
*
|
||||
* The database can be specified by name, using the in_dbname parameter, or by
|
||||
@@ -901,7 +902,8 @@ InitPostgres(const char *in_dbname, Oid dboid,
|
||||
}
|
||||
else
|
||||
{
|
||||
InitializeSessionUserId(username, useroid);
|
||||
InitializeSessionUserId(username, useroid,
|
||||
(flags & INIT_PG_OVERRIDE_ROLE_LOGIN) != 0);
|
||||
am_superuser = superuser();
|
||||
}
|
||||
}
|
||||
@@ -910,7 +912,7 @@ InitPostgres(const char *in_dbname, Oid dboid,
|
||||
/* normal multiuser case */
|
||||
Assert(MyProcPort != NULL);
|
||||
PerformAuthentication(MyProcPort);
|
||||
InitializeSessionUserId(username, useroid);
|
||||
InitializeSessionUserId(username, useroid, false);
|
||||
/* ensure that auth_method is actually valid, aka authn_id is not NULL */
|
||||
if (MyClientConnectionInfo.authn_id)
|
||||
InitializeSystemUser(MyClientConnectionInfo.authn_id,
|
||||
|
||||
Reference in New Issue
Block a user