Cakephp管理员和用户登录分开

时间:2014-02-12 00:10:12

标签: php cakephp

我想做一个用户可以正常登录的应用程序,以及管理员可以登录的后端。

到目前为止,我创建了这个:

routes.php文件

$prefix = 'admin';

Router::connect(
    "/{$prefix}/:plugin/:controller",
    array('action' => 'index', 'prefix' => $prefix, $prefix => true)
);
Router::connect(
    "/{$prefix}/:plugin/:controller/:action/*",
    array('prefix' => $prefix, $prefix => true)
);
Router::connect(
    "/{$prefix}/:controller",
    array('action' => 'index', 'prefix' => $prefix, $prefix => true)
);
Router::connect(
    "/{$prefix}/:controller/:action/*",
    array('prefix' => $prefix, $prefix => true)
);

AppController的:

public $components = array(
    'DebugKit.Toolbar',
    'Session',
    'Auth' => array(
        'loginRedirect' => array(
            'controller' => 'pages',
            'action' => 'display'
        ),
        'logoutRedirect' => array(
            'controller' => 'pages',
            'action' => 'display',
            'home'
        ),
        'authorize' => 'Controller',
        'authError' => 'Access denied! Did you really think that you can access that?'
    )
);

public function isAuthorized($user) {
    // Admin can access every action
    if (isset($user['role']) && $user['role'] === 'admin') {
        return true;
    }

    // Default deny
    return false;
}

public function beforeFilter() {
    $this->Auth->allow('display');
    //$this->recordActivity();
    if($this->request->prefix == 'admin'){
        $this->layout = 'admin';
    }   
}

当我尝试访问需要auth的前端页面时,它会给我login()动作,但是当尝试访问/ admin时,它会将我重定向到/ users / login。

我想要两个具有不同布局的独立登录系统。一个用于普通用户,一个用于管理员用户。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

我不建议仅为了不同的视图而进行两次login()操作。您可以将if语句从beforeFilter()移至UsersController::login()以正确设置布局。但是,如果您确实要继续执行单独的操作,请在AuthComponent::loginAction中设置AppController::beforeFilter()属性,如:

if($this->request->prefix == 'admin'){
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'admin_login', 'plugin' => false);
}

其中admin_login将是您在UsersController中创建的另一个操作。

另外,我建议使用cake book中提到的cake的默认前缀路由。它与您所做的非常相似,但您不必手动创建路线。另外,如那里所述,要访问/ admin,您需要定义一个路径,如:

Router::connect(
    '/admin',
    array('controller' => 'pages', 'action' => 'index', 'admin' => true)
);