在简单的CMS上工作 - 如何处理用户拥有的访问权限?

时间:2012-09-28 12:52:15

标签: php mysql database

我正在开发个人CMS,但我遇到了问题。我想将访问级别定义为CAN_DELETE_THREAD,CAN_EDIT_MESSAGE或CAN_CREATE_THREAD作为二进制标志,但我不知道函数'has_flag'是如何工作的。例如,如果我从数据库中获取用户并想检查他是否可以编辑消息,我将如何进行此操作?

谢谢!

3 个答案:

答案 0 :(得分:1)

您是否需要按用户或按角色访问设置?

每个角色的可扩展性更高,特别是如果您的系统将为许多用户开放。

首先,我将定义用户可以执行的操作,按某个类别(“线程”与[添加,编辑,删除,标记,存档,随便]分组),然后您可以创建一个列表来定义每个角色和每个动作如果被允许或拒绝。

如果您定义默认值,则可以减少该表中所需规格的数量(如果未被拒绝则允许一切,反之亦然)。

需要更多细节以获得进一步的帮助;)

答案 1 :(得分:1)

您可以创建一个permissions数据库表和一个加入用户权限的permissions_users表,然后在每页的基础上检查登录用户是否可以查看该页面。 / p>

想象一下,你有一个User模型,以及一个ID为1的权限:

if ($user->hasPermission(1)) {
    // show form or whatever
}
else {
    throw new ForbiddenException();
}

您的hasPermission()方法可能非常简单:

<?php
class User extends Model {

    public function hasPermission($permission_id) {
        $sql = "SELECT COUNT(*) FROM `permissions_users` WHERE `user_id` = :user_id AND `permission_id` = :permission_id";
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindParam(':user_id', $this->id, PDO::PARAM_INT);
        $stmt->bindParam(':permission_id', $permission_id, PDO::PARAM_INT);
        return ($this->pdo->fetchColumn() > 0); // returns true if at least 1 result
    }
}

显然,你需要调整它以适合你的应用程序。

答案 2 :(得分:0)

您可以通过多种方式实现这一目标。您可以存储与用户关联的整数属性,然后将标志定义为2的整数幂:

define('CAN_CREATE_THREAD', 0x0010);
define('CAN_DELETE_THREAD', 0x0020);

然后到你的hasFlag($flag)就像是

return ($this->BinaryFlags & $flag);

否则,您可以将所有标志存储在数据库中:

CREATE TABLE flags
(
    id integer not null primary key auto_increment,
    name varchar(32)
);

CREATE TABLE has_flag
(
    user_id integer,
    flag_id integer
);

,你的hasFlag函数是对数据库的查询。

角色级访问是相同的,除了您不存储将它们与用户相关联的标记,而是将用户与角色相关联(因此您有一个像{{1}这样的表}),然后将标志关联到角色,如上所示。

优点是您可以将人员定义为“Section XYZ Administrator”,而无需逐个记住和设置所有权限;缺点是您不能拥有中间状态(例如,可以编辑但不能创建的半管理员),除非您首先创建角色。