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