我们今年在课堂上看到了PostgreSQL角色。我们的老师告诉我们,如有必要,为每个表甚至列使用具有自定义权限的不同角色会更安全。
我们有一个项目,在该项目中,我们必须使用 PostgreSQL 为连接用户构建一个访问受限的网站,这些用户可以是不同类型的(管理员、员工、客户(。为了遵循教师的建议,我们创建了具有不同权限的不同角色(每种类型的用户对应一个角色(。
我们决定将 Go 用于我们的后端(带有令牌身份验证(,但我无法弄清楚如何使用我们的角色,这些角色更多的是组而不是用户。我在文档中读到,您一次"打开"与数据库的连接,但要这样做,您必须提供一个 PostgreSQL 角色。我没有找到在不关闭并重新打开数据库的情况下更改连接角色的方法。如果我在不更改连接角色的情况下运行应用程序,PostgreSQL 如何控制用户是否有权访问他请求所需的表。
您可以在PostgreSQL中即时更改角色。如果您以nobody
身份登录,并且nobody
是角色cleve
的成员,则可以成为角色admins
SET ROLE cleve;
但是在身份验证期间使用它是有问题的,因为没有什么可以阻止用户运行语句
RESET ROLE;
再次成为nobody
,然后冒充别人。
通常,有两种方法可以使用角色系统来利用数据库权限:
应用程序的每个用户都有一个个性化的数据库用户。
当然,这只有在用户集相当恒定且有限的情况下才可行。
然后单个用户根本没有权限,并且有某些角色,例如
admin
,reader
,accountant
等。登录角色通过成为其中一个或多个角色的成员来分配权限,并继承其权限。您没有个性化的数据库用户。
然后,每组权限只有一个登录角色,例如
accountant
、admin
、viewer
等。在建立数据库连接之前,应用程序必须决定应连接哪个用户。如果需要此决策的数据库查询,请以权限非常有限的
nobody
数据库用户身份执行这些查询。例如,它可以调用验证用户提供的密码的函数。
您可以使用 set role 命令在会话打开时更改角色。