RBAC или ACL, для частного контента?

#php #django #content-management-system #security

#php #django #content-management-system #Безопасность

Вопрос:

Пытаюсь создать микро-CMS (своего рода), которая на данный момент должна передавать контент, то есть только изображения, пользователю, вошедшему в систему через имя пользователя / пароль.

Допустим, таких пользователей может быть 10 тыс., и у каждого пользователя в их собственной учетной записи около 100-1 тыс. изображений, которые никто другой не должен иметь возможности просматривать. Каков был бы рекомендуемый подход к созданию такой системы?

Мои инстинкты подсказывают мне, что ACL — это правильный подход, поскольку «роли» в моем случае являются общими — ничего, поэтому мне пришлось бы создавать столько ролей, сколько пользователей. Я правильно направляюсь?

Ответ №1:

Особым видом роли может быть «роль владельца». Эта роль применяется, когда вы являетесь владельцем объекта. Идея для реализации в клиентском коде:

 if ($owner->isAllowed('view', $image) { do stuff }
  

Система RBAC:

 // initiation of roles somewhere
$this->roles->add(new OwnerRole($user); }

// when called
$roles = $this->getRoles($user);
foreach ($roles as $role) {
     if ($role->isAllowed($user, $action, $object)) { return true; }
}
  

Это означает, что роль владельца должна иметь возможность проверять, кому принадлежит объект:

 class OwnerRole implements Role
{
    public function __construct(OwernChecker $ownerChecker) {
        $this->owerChecker = $ownerChecker;
    }
    public function isAllowed(User $user, $action, $object) {
        if ($this->ownerChecker->userOwnsObject($user, $object)) etc
    }
}
  

Объекту ownerChecker могут быть предоставлены сопоставления того, как проверить, что пользователь владеет объектом.

Рекомендуется прочитать следующее:
http://www.xaprb.com/blog/2006/08/16/how-to-build-role-based-access-control-in-sql/
http://www.sqlrecipes.com/database_design/fine_grained_role_based_access_control_rbac_system-3/