1

我遵循了这个“简单 ACL 控制的应用程序”CakePHP 教程:http ://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html

一切正常,但该应用程序有一个我不喜欢的怪癖。

在示例中,存在三个角色:管理员、经理和用户。我使用具有用户角色的帐户登录。当我单击我无权访问的链接时,我会被重定向到当前 url,因此,从本质上讲,似乎没有任何事情发生。我不喜欢这样,因为它看起来像应用程序没有响应。

如何将用户重定向到“权限被拒绝”页面而不是重定向到推荐人?我已经在UsersController命名permissionDenied和相应的视图中创建了一个新操作。我还为该操作创建了 aco 并允许所有组访问它。

4

1 回答 1

1

似乎什么都没有发生的原因是因为您没有在视图中显示 Acl 组件生成的 flash 消息(正如 Dave 在评论中已经提到的那样)。您必须将其添加到您的布局或视图中:

echo $this->Session->flash('auth');

这样,用户将看到您authErrorAuthComponent.

另一种方法是在 AppController 的 beforeFilter 方法中运行 Acl 检查,如果 Acl 检查失败,则重定向用户,如下所示:

/**
 * ACL Check (CakeError controller is exempt from this example,
 * so errors are always "allowed" to be shown).
 */
if (!is_null($this->Auth->User()) && $this->name != 'CakeError'
    && !$this->Acl->check(array(
        'model' => 'User',
        'foreign_key' => AuthComponent::user('id')),
        $this->name . '/' . $this->request->params['action']
)) {

    // Optionally log an ACL deny message in auth.log
    CakeLog::write('auth', 'ACL DENY: ' . AuthComponent::user('username') .
        ' tried to access ' . $this->name . '/' .
        $this->request->params['action'] . '.'
    );

    // Render the forbidden page instead of the current requested page
    echo $this->render('/Pages/forbidden');

    /**
     * Make sure we halt here, otherwise the forbidden message
     * is just shown above the content.
     */
    exit;
}

这样,app/View/Pages/forbidden.ctp文件将被呈现,exit 语句将阻止重定向发生。

于 2013-03-01T13:09:47.380 回答