Skip to content

Commit 54e506c

Browse files
authored
define default access privileges for default users too (zalando#1512)
* define default access privileges for default users too * extend docs on defaultUsers
1 parent 53fb540 commit 54e506c

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

docs/user.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,8 @@ The roles described in the previous paragraph can be granted to LOGIN roles from
522522
the `users` section in the manifest. Optionally, the Postgres Operator can also
523523
create default LOGIN roles for the database an each schema individually. These
524524
roles will get the `_user` suffix and they inherit all rights from their NOLOGIN
525-
counterparts.
525+
counterparts. Therefore, you cannot have `defaultRoles` set to `false` and enable
526+
`defaultUsers` at the same time.
526527

527528
| Role name | Member of | Admin |
528529
| ------------------- | -------------- | ------------- |
@@ -545,6 +546,10 @@ spec:
545546
defaultUsers: true
546547
```
547548

549+
Default access privileges are also defined for LOGIN roles on database and
550+
schema creation. This means they are currently not set when `defaultUsers`
551+
(or `defaultRoles` for schemas) are enabled at a later point in time.
552+
548553
### Schema `search_path` for default roles
549554

550555
The schema [`search_path`](https://www.postgresql.org/docs/13/ddl-schemas.html#DDL-SCHEMAS-PATH)

pkg/cluster/database.go

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,30 @@ func (c *Cluster) execCreateDatabaseSchema(databaseName, schemaName, dbOwner, sc
351351
}
352352

353353
// set default privileges for schema
354+
// the schemaOwner defines them for global database roles
354355
c.execAlterSchemaDefaultPrivileges(schemaName, schemaOwner, databaseName)
356+
357+
// if schemaOwner and dbOwner differ we know that <databaseName>_<schemaName> default roles were created
355358
if schemaOwner != dbOwner {
356-
c.execAlterSchemaDefaultPrivileges(schemaName, dbOwner, databaseName+"_"+schemaName)
357-
c.execAlterSchemaDefaultPrivileges(schemaName, schemaOwner, databaseName+"_"+schemaName)
359+
defaultUsers := c.Spec.PreparedDatabases[databaseName].PreparedSchemas[schemaName].DefaultUsers
360+
361+
// define schema privileges of <databaseName>_<schemaName>_owner_user for global roles, too
362+
if defaultUsers {
363+
c.execAlterSchemaDefaultPrivileges(schemaName, schemaOwner+constants.UserRoleNameSuffix, databaseName)
364+
}
365+
366+
// collect all possible owner roles and define default schema privileges
367+
// for <databaseName>_<schemaName>_reader/writer roles
368+
owners := c.getOwnerRoles(databaseName, c.Spec.PreparedDatabases[databaseName].DefaultUsers)
369+
owners = append(owners, c.getOwnerRoles(databaseName+"_"+schemaName, defaultUsers)...)
370+
for _, owner := range owners {
371+
c.execAlterSchemaDefaultPrivileges(schemaName, owner, databaseName+"_"+schemaName)
372+
}
373+
} else {
374+
// define schema privileges of <databaseName>_owner_user for global roles, too
375+
if c.Spec.PreparedDatabases[databaseName].DefaultUsers {
376+
c.execAlterSchemaDefaultPrivileges(schemaName, schemaOwner+constants.UserRoleNameSuffix, databaseName)
377+
}
358378
}
359379

360380
return nil
@@ -418,6 +438,15 @@ func makeUserFlags(rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin
418438
return result
419439
}
420440

441+
func (c *Cluster) getOwnerRoles(dbObjPath string, withUser bool) (owners []string) {
442+
owners = append(owners, dbObjPath+constants.OwnerRoleNameSuffix)
443+
if withUser {
444+
owners = append(owners, dbObjPath+constants.OwnerRoleNameSuffix+constants.UserRoleNameSuffix)
445+
}
446+
447+
return owners
448+
}
449+
421450
// getExtension returns the list of current database extensions
422451
// The caller is responsible for opening and closing the database connection
423452
func (c *Cluster) getExtensions() (dbExtensions map[string]string, err error) {

pkg/cluster/sync.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -740,8 +740,11 @@ func (c *Cluster) syncDatabases() error {
740740
if err := c.initDbConnWithName(preparedDatabase); err != nil {
741741
return fmt.Errorf("could not init database connection to %s", preparedDatabase)
742742
}
743-
if err = c.execAlterGlobalDefaultPrivileges(preparedDatabase+constants.OwnerRoleNameSuffix, preparedDatabase); err != nil {
744-
return err
743+
744+
for _, owner := range c.getOwnerRoles(preparedDatabase, c.Spec.PreparedDatabases[preparedDatabase].DefaultUsers) {
745+
if err = c.execAlterGlobalDefaultPrivileges(owner, preparedDatabase); err != nil {
746+
return err
747+
}
745748
}
746749
}
747750

0 commit comments

Comments
 (0)