我正在考虑从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兼容(直到后一版本上线)。
答案 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);
^