如何向PostgreSQL表授予有限权限?

时间:2015-05-29 18:20:37

标签: php postgresql pdo

我正在考虑从MySQL切换到PostgreSQL,因为MySQL在共享托管环境中的全文功能有限(最小字长不能改变)。我没有PostgreSQL的管理经验,我很难理解授予用户/角色的权限。

我的应用有两个用户,一个用于构建,一个用于运行时。我希望运行时用户只拥有这些权限:

SELECT, INSERT, UPDATE, DELETE

因此我登录PostgreSQL:

sudo -u postgres psql postgres

在查阅了手册和各种互联网资源后,我创建了这个演示,目的是对所有未来的表具有有限的权限。来自一个全新的数据库:

CREATE USER job_frontend PASSWORD 'password';
DROP DATABASE IF EXISTS job_frontend;
CREATE DATABASE job_frontend ENCODING 'UTF8';
CREATE ROLE job_runtime;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO job_runtime;
GRANT job_runtime TO job_frontend;

我的策略,可能是我出错的地方:创建用户,为角色设置授权,然后将角色授予分配给用户。我是否需要从数据库中删除一些默认权限?在MySQL中,默认情况下用户没有权限,而且我可能会陷入这种心态。

然后我使用PDO / PHP尝试各种操作(当然我修改了prepare()来运行我想要的项目:

<?php

$dsn  = 'pgsql:dbname=job_frontend;host=localhost;user=job_frontend;password=password';
$db = new PDO($dsn);

// These should succeed
$sqlRead = "SELECT * FROM x";
$sqlWrite = "INSERT INTO x (id) VALUES (1)";

// This should fail but in fact succeeds
$sqlCreate = "CREATE TABLE x (id INTEGER)";

$stmt = $db->prepare($sqlRead);
if ($stmt === false)
{
    print_r($db->errorInfo());
}

$stmt->execute();
echo "Count: " . $stmt->rowCount() . "\n";

if ($rows = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
    print_r($rows);
}

根据评论,CREATE TABLE成功,但我不想这样做。我错过了什么?

我相信共享的PostgreSQL环境将是8.3,但是稍后可能会在以后使用(我注意到这一点,因为我看到有各种授权选项在9​​.x之前不可用)。我在本地运行9.3测试,但是现在想要保持与8.3兼容(直到后一版本上线)。

1 个答案:

答案 0 :(得分:1)

默认情况下,任何人都可以在架构“public”中执行所有操作。

postgres=# CREATE ROLE tom LOGIN; -- user without rights
CREATE ROLE
postgres=# SET role tom ;
SET
postgres=> CREATE TABLE bubu(a int);
CREATE TABLE

您必须在公共架构上从PUBLIC中删除CREATE,默认情况下是这样。

postgres=# REVOKE CREATE ON SCHEMA public FROM public;
REVOKE
postgres=# SET role tom;
SET
postgres=> CREATE TABLE foo(a int);
ERROR:  permission denied for schema public
LINE 1: CREATE TABLE foo(a int);
                     ^