SQL在一个命令中检查用户访问权限?

时间:2013-09-25 19:20:16

标签: mysql sql

我正在尝试检查用户是否可以在SQL中的一个命令中访问一个文档。我尽量避免在checkAccess()函数中添加太多PHP。

我有一个用户名和一个文档ID。

假设用户名为user1,文档ID为24

这些是我的表格:

mysql> describe permissions;
+--------+----------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra          |
+--------+----------+------+-----+---------+----------------+
| id     | int(11)  | NO   | PRI | NULL    | auto_increment |
| wfId   | char(50) | NO   |     | NULL    |                |
| docId  | char(50) | NO   |     | NULL    |                |
| userId | int(11)  | NO   | MUL | NULL    |                |
+--------+----------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> describe users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| login    | char(30) | NO   |     | NULL    |                |
| password | char(50) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> describe documents;
+---------+-----------+------+-----+---------+----------------+
| Field   | Type      | Null | Key | Default | Extra          |
+---------+-----------+------+-----+---------+----------------+
| id      | int(11)   | NO   | PRI | NULL    | auto_increment |
| name    | char(100) | YES  |     | NULL    |                |
| wfid    | char(50)  | YES  |     | NULL    |                |
| docid   | char(50)  | YES  |     | NULL    |                |
| created | datetime  | YES  |     | NULL    |                |
| updated | datetime  | YES  |     | NULL    |                |
+---------+-----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

这是我正在构建的查询:

mysql> select u.login, d.id, d.wfid, d.docid, p.wfId, p.docId, p.userId
from permissions p, documents d inner join users u
ON (u.login = "user1" AND d.id = 24 AND p.docId=d.docid AND p.wfId=d.wfid);
ERROR 1054 (42S22): Unknown column 'p.docId' in 'on clause'

但先前已宣布p.wfId。关于如何做得更好或者我的句子中的错误有什么帮助?

我的目标是返回一个结果,然后授予访问权限。如果查询结果为空集,则拒绝访问。

感谢。

2 个答案:

答案 0 :(得分:1)

尝试一下:

select u.login, d.id, d.wfid, d.docid, p.wfId, p.docId, p.userId
from permissions p
inner join documents d on p.docId=d.docid AND p.wfId=d.wfid
inner join users u ON u.login = "user1" AND d.id = 24

答案 1 :(得分:1)

SELECT u.login, d.id, d.wfid, d.docid, p.wfId, p.docId, p.userId
FROM permissions p
JOIN documents d ON p.docId = d.docid AND p.wdId = d.wdid
JOIN users u ON p.userId = u.id
WHERE u.login = "user1" and d.id = 24

您收到的错误是因为您的JOIN条款仅在documentsusers之间;由于permissions未加入,因此您无法在p.docId子句中引用ON

您还错过了userspermissions之间的加入条件,因此您可以获得所有人的权限,而不仅仅是user1的权限。

只检查单个表而不是表之间的关系的条件应该在WHERE子句而不是ON中(例外:OUTER JOIN有时需要限制到子集正在加入的表,这应该在ON子句中完成。