CakePHP Auth拒绝管理员路由页面

时间:2011-08-28 12:09:30

标签: cakephp roles authentication

我整个下午一直在阅读Stack Overflow问题,试图解决这个问题。

我有一个带索引/登录/注销/注册功能的用户控制器,但也有admin_index / admin_add / admin_edit / admin_delete等。

我启用了Auth组件,在我的users_controller中,我试图拒绝访问admin_ *页面Auth.User.role != 'admin',当我启用$this->Auth->authorize = 'controller';时,它拒绝访问site.com/admin / users / page并且即使我的帐户将角色设置为admin,也似乎会终止注销功能。

但是,如果我在i中输入网址,会被重定向回主页。

users_controller.php中

<?php
class UsersController extends AppController {

    var $name = 'Users';

    function beforeFilter(){
        parent::beforeFilter();
        $this->Auth->authorize = 'controller';
        $this->Auth->allow('register');
    }

    function isAuthorized() {
        if ($this->Auth->user('role') != 'admin') {
            $this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
        }
    }

app_controller.php

<?php
class AppController extends Controller {

    var $components = array('Auth', 'Session');

    function beforeFilter() {
        $this->Auth->loginAction = array('controller'=>'users','action'=>'login', 'admin'=>false);
        $this->Auth->logoutRedirect = array('controller'=>'users','action'=>'logout');
        $this->Auth->loginRedirect = array('controller'=>'shows', 'action'=>'index');
        $this->Auth->autoRedirect = false;
        $this->Auth->allow('home');
    }

我的第二个问题涉及$this->Auth->deny('page');重定向用户的方式,据我所知它重定向到/但我需要它重定向回用户控制器。

希望一切都有意义,我已经提供了足够的信息..

2 个答案:

答案 0 :(得分:8)

问题的根源可能是你的isAuthorized()方法。这应该只返回true或false,并指示经过身份验证的用户是否已授权访问特定操作。

很难说为什么要重定向到主页而不是登录页面。但是你可能在某个地方有其他代码搞砸了。

尝试修改您的代码,如下所示,看看这是否有助于让事情顺利进行:

<强> app_controller.php

<?php 
class AppController extends Controller {
    var $components = array('Session', 'Auth' => array(
        'loginAction' => array('controller'=>'users','action'=>'login', 'admin'=>false),
        'logoutRedirect' => array('controller'=>'users','action'=>'logout'),
        'loginRedirect' => array('controller'=>'shows', 'action'=>'index'),
        'autoRedirect' => false,
        'authorize' => 'controller'
    );

function beforeFilter() {
    $this->Auth->allow('home');
}

function isAuthorized() {
    if (!empty($this->params['prefix']) && $this->params['prefix'] == 'admin') {
        if ($this->Auth->user('role') != 'admin') {
            return false;
        }
    }
    return true;
}
?>

<强> users_controller.php中

<?php
class UsersController extends AppController {

var $name = 'Users';

function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow('register');
}
?>

我将所有Auth设置移动到$ components变量中的声明,因为它看起来更干净,并且在那里声明默认值更有意义。但这更多是个人偏好的问题,它不应该对代码的功能产生实际影响。

另请注意,如果将autoRedirect设置为false,则必须在Users :: login()操作中手动重定向已登录的用户,并使用{{获取loginRedirect值1}}。

我没有看到任何理由为什么你应该被发送到/当你没有登录并且你试图访问被阻止的动作,但是在你修复上述内容之后可能会更容易理解。 * *

答案 1 :(得分:-1)

你应该这样做......

       function beforeFilter()
        {
        if($this->Auth->user('role')=='admin'){
         $this->Auth->allow('admin_view','admin_controls');//put your all admin actions separated by comma

         }
else
{
$this->Auth->allow('home');//put your all non-admin actions separated by comma
}


    }

希望它能奏效......如果有任何问题让我知道......