2012-03-16 96 views
2

这个问题并不少见,但我真的不知道该如何实现这一点。 我在我的小型论坛有500个注册用户,他们有文件上传到我的服务器。 由于我的用户已经在我的web服务器上映射了我的目录结构,所以他们能够访问我注册用户上传的文件,即使他们不拥有它。 我使用一个名为Yii和MySQL的PHP​​框架来管理我的用户,但是我想让我的用户只访问他们自己的文件,而不是其他人的文件。我正在考虑使用htaccess,但这种方法有点模糊。网站用户帐号目录访问

如果您有任何意见或建议,请有点张贴解答^^ 感谢

例: 用户“真身”有一个文件夹名为“mamifolder” 但用户“大地”必须不能够访问“ mamifolder”。用户“大地”只能访问“dadifolder”

的解决方案,我知道,但有重大缺点:

1)是存储在数据库中的所有文件(缺点:这是自天一个非常糟糕的做法这是不是一个很好的做法,我认为)

2)是使上传的文件受htaccess保护,并让php呈现上传的文件(缺点:另一个糟糕的做法,使网络应用程序非常缓慢例如私人图片将使用php加载,如果有很多私人图片会在同一页面同时加载)

回答

2

我会说你唯一的选择是移动文件从您的公共网络目录中移出并使用类似this的东西。您只需将文件的ID存储在数据库中,而不是整个文件。

+0

这个解决方案会很慢吗?我将同时在同一页面中呈现10张以上的图像。 – 2012-03-16 09:31:35

+0

但是,您现在如何加载它们?你打算加载图片的缩略图吗? – Puigcerber 2012-03-16 09:34:16

+0

只是标记... – 2012-03-17 06:30:09

2

为此,您必须使用Role Base Access Control幸运的是,Yii提供了非常强大的RBAC实现。 Role-Based Access Control是你的事。你将不得不使用它的业务规则。有针对一种或多种方式,但是这是最好的一个

对于实例

$this->_authManager->createOperation("updateHotel","update Hotel information"); 
$bizRule='return Yii::app()->user->id==$params["model"]->user_id;'; 
$task = $this->_authManager->createTask("updateOwnHotel","update hotel by manager himself",$bizRule); 
$task ->addChild("updateHotel"); 
$role=$this->_authManager->createRole("manager"); 
$role->addChild("updateOwnHotel"); 

现在上面的代码是什么呢? 它创建了一个操作updateHotel,然后创建业务规则需要的参数,那么你创建一个应该例如在执行任务是updateOwnHotel ,那么你必须创建一个你打算有那么分配角色什么都前managerreader角色子女updateOwnHotel

在应用程序中执行操作时,您需要做的仅仅Yii::app()->checkAccess('updateOwnHotel',$prams)这将返回true或false,他可以更新或不是酒店,您可以做类似的与你的情况下

+0

Yii的RBAC是基于授权项目......这意味着我只能在我的控制器中禁止未经授权的操作而不能访问文件。 – 2012-03-16 07:36:21

+0

不,你将不得不定义'角色','任务'和这样的东西看更新和 – 2012-03-16 10:10:50