我的网络应用程序有多个部署 - 每个部署都是一个具有唯一网址的唯一网站 每个部署都有不同的数据,UI等,但是Postgresql数据库结构非常相似(使用PostGIS)。数据库都存在于同一个DB服务器上。我希望1个部署的用户能够登录所有其他部署的应用程序,而无需重新注册。
我想要的是在多个应用数据库之间共享的单个“用户”表。任何在一个应用程序中注册的用户都应该被所有其他应用程序识别。 Postgres有可能吗?模式是否可以做到这一点?
答案 0 :(得分:18)
是的,架构是解决方案。使用单个PostgreSQL集群和一个数据库。
为所有应用用户创建一个群组:
CREATE ROLE app;
创建全局“app”模式,其中所有全局共享应用程序表都将存在。
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
为每个部署创建单独的用户(没有超级用户权限):
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
(可选)您可以在选定的应用对象上为这些用户授予显式权限,而不是IN ROLE app
:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
创建私有模式,其中存在与部署相关的表:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
现在,每个部署的应用程序都有一个私有模式;但与此同时,您可以共享全局数据。
有什么好处,是应用程序不必是架构感知的。如果您以SELECT * FROM froobles
用户身份连接,则SELECT * FROM app01.froobles
默认会解析为app01
。您不必指定架构名称。
作为一项额外措施,您可以使用表继承来按部署扩展全局对象:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );
答案 1 :(得分:4)
filiprem的答案很棒..但是,我发现我还需要为用户设置路径app01
,app02
:
ALTER USER app01 SET SEARCH_PATH TO "$user",app;
ALTER USER app02 SET SEARCH_PATH TO "$user",app;
此外,如果您需要角色app
来访问模式app01,app02中的表,您将需要以下代码:
-- grant all future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA app01 GRANT SELECT ON TABLES TO app;
-- grant all existing tables
GRANT SELECT
ON ALL TABLES IN SCHEMA app01
TO app
您可以拥有其他权限,而不是SELECT
。用户app02
也是如此。
更新:为了能够让用户app
选择app01
架构中的行,它至少需要USAGE
架构app01
权限{ {1}}(以及上面定义的表格权限SELECT
):
GRANT USAGE ON SCHEMA app01 TO app;
答案 2 :(得分:2)
看看dblink。