使用URL domain.com/account/controller/action在一个CakePHP应用程序中处理多个帐户和用户

时间:2010-02-12 20:51:33

标签: php .htaccess mod-rewrite cakephp

我需要完成的是一个包含单个数据库但有多个帐户(公司)的应用程序,每个帐户都有多个用户。

URL约定必须如下:domain.com/account/controller/action

所以所有控制器都以公司/帐户名为前缀。

所有帐户都将共享单个数据库,但每个帐户都需要能够限制对其数据的访问。

问题是,我该如何实现?我已经考虑实现某种htaccess重写,我删除了第一个URL参数(account)并作为查询字符串参数传递,该参数将由app_controller在内部解析。然而,挑战在于通过整个应用程序中的所有链接保持完整性。即蛋糕路由会以某种方式需要知道帐户参数并将其传递给所有输出的链接。

之前有没有人做过类似的事情?

2 个答案:

答案 0 :(得分:0)

完全有可能这样做(但我从来没有这样做过)。

我假设您使用标准的CakePHP身份验证方案。如果是这样,可以在Auth->用户阵列中找到有关当前登录用户的信息。

Cake希望您在数据库中拥有一个users表。您应该更改模型,使其与用户表具有belongsTo关系(即所有表都有user_id字段)。

在你的模型中,你可以使用afterFind()钩子来检查user_id字段是否与当前登录的用户匹配,如果不是这样,则返回false。在您的控制器中,您应该检查所有模型操作是否存在错误。

.htaccess的想法可能不太好。您应该尽可能将授权放在数据源中,在模型中的蛋糕中(您可以将afterFind回调放在AppModel类中)。

扩展你的例子:

用户请求/ someController / someAction。

someAction:

if($this->someModel->someOperation(someArgument)) {

   //OK, show view

} else {

   // Something went wrong
   // Your afterFind method provides a clue via the model->failure attribute

   $this->flash($this->someModel->failure);

}

答案 1 :(得分:0)

你可以用Routes做两件事。

首先,在路线中设置变量:

Router::connect('/:user/blog/*', array('controller' => 'blogs', 'action' => 'index'));

现在您可以使用$this->params['user']访问用户变量了。与此相关的是,您必须手动设置要管理的每个控制器和操作。我认为这没什么大不了的,因为大多数情况下重写CakePHP的默认路由架构会更好。

其次,您可以告诉您正在等待变量,并且可以作为函数中的参数进行访问。

Router::connect('/(.*)/*', array('controller' => 'blogs', 'action' => 'index'));

在您的控制器中:

function index($a, $b){
    pr($a);
    pr($b);
}

现在你将获得两个变种。

我不知道是否可以自动制作,也许重写htaccess可能是一个好主意。

希望它有所帮助。