基于cakephp组的权限

时间:2011-01-11 09:57:40

标签: authentication cakephp cakephp-1.3 acl

我希望基于组的限制允许用户只访问网络的指定部分。我是整个ACL的新手,我从手册中得不到它:/因此我想问一些问题。

但在提出任何问题之前,我的路线看起来像这样:

Router::connect('/', array('controller' => 'users', 'action' => 'login'));
Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin', 'admin' => true));
Router::connect('/registered/:controller/:action/*', array('prefix' => 'registered', 'registered' => true));

1.。)如何限制除Administrator以外的任何其他组的用户仅访问网络的/registered/部分

2.。)如何阻止任何人在全球范围内使用www.example.com/users/add等默认地址(我只想要www.example.com/admin/users/addwww.example.com/registered/users/add类型的地址)?这种地址不是routes.php中设置的事件,但仍可以使用。

任何答案都赞赏

2 个答案:

答案 0 :(得分:3)

首先是这块蛋糕是1.3还是1.2? 在1.3前缀路由使用。您可以设置多个前缀,例如,我现在正在开发一个需要管理员通过管理员/控制器/操作进行控制的站点,而且我还将某些区域限制为仅注册用户...例如/users/controller/action.

这样做比较容易,第一步是在core.php中设置前缀:

Configure::write('Routing.prefixes', array('admin', 'registered'));

这里记录: http://book.cakephp.org/view/950/Prefix-Routing

Auth组件可以在这里处理其他所有事情,你可以使用ACL等等,但我还没有深入研究这个问题,因为我现在正在创建的东西似乎过于复杂。

当我学习如何做到这一点时,我发现有用的教程是关于youtube的Andrew Perkins auth组件教程。 youtube.com/watch?v=FjXAnizmR94

共有3个部分,他解释得很清楚。

祝你好运!

答案 1 :(得分:1)

好的,这是一个有效的解决方案。 (/app/app_controller.php

function beforeFilter() {               
        if ((isset($this->params['admin']))) {
            $admin_grp = $this->UserGroup->find('first', array(
                'conditions' => array(
                    'UserGroup.name' => 'Administrator')));
            if ($this->Auth->user('user_group_id') != $admin_grp['UserGroup']['id']) {
                $this->Session->setFlash(__('Access denied.', true));
                $this->redirect("/registered");
            } else {
                $this->layout = 'admin';
            }
        } else if (isset($this->params['registered'])) {
            if (!$this->Auth->user()) {
                $this->Session->setFlash(__('Access denied. You need to login first.', true));
                $this->redirect("/users/login");
            }
            $this->layout = 'registered';
        } else {
            $this->layout = 'default';
        }
}