mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
ALTER TABLE .. FORCE ROW LEVEL SECURITY
To allow users to force RLS to always be applied, even for table owners, add ALTER TABLE .. FORCE ROW LEVEL SECURITY. row_security=off overrides FORCE ROW LEVEL SECURITY, to ensure pg_dump output is complete (by default). Also add SECURITY_NOFORCE_RLS context to avoid data corruption when ALTER TABLE .. FORCE ROW SECURITY is being used. The SECURITY_NOFORCE_RLS security context is used only during referential integrity checks and is only considered in check_enable_rls() after we have already checked that the current user is the owner of the relation (which should always be the case during referential integrity checks). Back-patch to 9.5 where RLS was added.
This commit is contained in:
@@ -3014,7 +3014,8 @@ ri_PlanCheck(const char *querystr, int nargs, Oid *argtypes,
|
||||
/* Switch to proper UID to perform check as */
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner,
|
||||
save_sec_context | SECURITY_LOCAL_USERID_CHANGE);
|
||||
save_sec_context | SECURITY_LOCAL_USERID_CHANGE |
|
||||
SECURITY_NOFORCE_RLS);
|
||||
|
||||
/* Create the plan */
|
||||
qplan = SPI_prepare(querystr, nargs, argtypes);
|
||||
@@ -3134,7 +3135,8 @@ ri_PerformCheck(const RI_ConstraintInfo *riinfo,
|
||||
/* Switch to proper UID to perform check as */
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(RelationGetForm(query_rel)->relowner,
|
||||
save_sec_context | SECURITY_LOCAL_USERID_CHANGE);
|
||||
save_sec_context | SECURITY_LOCAL_USERID_CHANGE |
|
||||
SECURITY_NOFORCE_RLS);
|
||||
|
||||
/* Finally we can run the query. */
|
||||
spi_result = SPI_execute_snapshot(qplan,
|
||||
|
||||
Reference in New Issue
Block a user