2015-09-05 83 views
2

我正在开发一个库的小型数据库,但对于角色和权限我完全无知。 我花了相当一段时间的搜索,但我仍然没有真正得到机制。 我的目标是创建3个基本角色:在postgres上创建角色

  • 用户没有登录(不是一个真正的用户,只是有人谁希望看到图书馆在店内的书,但他不能做任何动作,除了刚看)
  • 用户的登录(他可以预购书,做其他动作)
  • 管理员(他可以添加新的书籍,作者,流派,可以给管理员权限的其他用户)

在第一我想我可以创建这3个角色,每个角色指定不同的权限然后在相关的网站上,每次有人连接时,他将被认为是“没有登录的用户”,直到确定他是否是管理员的登录名为止;阅读PostgreSQL文档我知道这不是这样,或者我错了。 我真的不知道该怎么做,任何帮助将不胜感激。

+0

其实谁/如何创建一个新用户? –

回答

0

你想要做的是合理的。您的Web应用程序应以用户身份(如mywebapp)以其连接池的身份登录,该用户的标记为NOINHERIT并且除了SET ROLE之外没有其他三个角色。这些角色中的每一个都描述了您在上面提到的用户类别之一。您还需要GRANT有权访问任何用于查找和验证mywebapp用户的用户的表格。

在为请求提供服务时,如果它代表匿名用户进行操作,它会执行SET ROLE anonymous_web_user;或其他任何操作。

如果它是作为指定用户使用的,它确实是SET ROLE authenticated_user;。您可以GRANT有权将用于验证用户身份的表格用于mywebapp角色,以便可以通过您的应用以任何方式对其进行身份验证。

如果它充当管理员,则确实为SET ROLE admin;。或者,如果管理员不多,而且他们需要不同的权限,则可以让他们成为PostgreSQL用户,并且SET ROLE the_admin_user_name;。再次,您的应用程序会预先验证它们,如果它满足用户的身份验证,则为SET ROLE

当连接返回到池时,它是重要池运行查询DISCARD ALL;以清除连接的角色设置。

因此,例如,您可能:

CREATE ROLE mywebapp WITH LOGIN NOINHERIT; 
CREATE ROLE anonymous_web_user; 
CREATE ROLE authenticated_user; 
CREATE ROLE admin_user; 

-- 'mywebapp' can become anyone, but by default doesn't 
-- get the rights of any of them since it's marked NOINHERIT 
GRANT admin_user TO mywebapp; 
GRANT anonymous_web_user TO mywebapp; 
GRANT authenticated_user TO mywebapp; 

-- All admins are authenticated users, since authenticated_user 
-- is INHERITable 
GRANT authenticated_user TO admin_user; 

-- All authenticated users have the rights of anon users too 
GRANT anonymous_web_user TO authenticated_user; 

-- The app must be able to look up users 
GRANT SELECT ON some_users_table TO mywebapp; 
-- but only admins can change them 
GRANT ALL ON some_users_table TO admin_user; 

... 

Role membership