cakephp登录重定向

时间:2011-09-14 21:57:15

标签: cakephp

我有一个用户前端和一个管理区域。如果用户已登录并尝试转到管理URL,则会将其重定向到索引页面。我希望将它们重定向到管理员登录页面,并以管理员身份登录。

可能存在管理员以用户身份登录然后尝试登录管理区域的情况。我无法重新访问管理员登录并提供注销选项并以管理员身份登录。

app_controller

function beforeFilter() {

    $this->Auth->loginError = "Wrong credentials";
    $this->Auth->authError = "This part of the website is protected.";

    //Configure AuthComponent   
    $this->Auth->allow('display');
    $this->Auth->authorize = 'actions';
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
    $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
    //$this->Auth->autoRedirect = false;
    //$this->Auth->loginRedirect = array('controller' => 'reservatins', 'action' => 'index');


} // end before filter

users_controller

function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allowedActions = array('admin_login','admin_logout');
    //$this->Auth->allowedActions = array('*');
    $this->set('select_nav', array('admin','users'));

}


function admin_login() {
    // $this->layout = 'admin'; // nothing required
    $this->layout = 'blank'; // nothing required
}

1 个答案:

答案 0 :(得分:3)

我已经在我的一个项目上完成了这项工作。用户曾登录(以匿名,用户或管理员身份),并且根据他的来源和当前的权限,我会显示不同的登录错误。

要做到这一点......这就是我做的......

首先,您需要使用“controller”授权方法:

$this->Auth->authorize = 'controller';

从现在开始,您的所有操作都将通过当前控制器的isAuthorized方法。由于我的用户,我的数据库上的组和权限以及每个组具有不同的权限,因此我在app_controller上创建了isAuthorized方法:

public function isAuthorized()
{
    if ( !$this->__permitted($this->name, $this->action) )
    {
        $this->cakeError('error403');
        return false;
    }
    return true;
}

我在这里做的是通过我的AppController __permitted方法检查用户权限(它只是检查会话的权限;如果我们没有在会话中保存它们,我在数据库上检查它们然后我将它们存储在Session上。

如果用户没有权限,我会向他显示错误403.这是有趣的部分。

在AppError中添加一个名为error403的方法,在这里您可以控制用户的重定向位置以及要向他显示的消息类型。

这是我使用过的代码(显然你必须根据自己的需要创建自己的代码):

public function error403()
{
    // Extract params
    extract($this->controller->params, EXTR_OVERWRITE);

    // Store url to be redirected on success
    if (!isset($url))
    {
        $url = $this->controller->here;
    }
    if (isset($url['url']))
    {
        $url = $url['url'];
    }
    $url = Router::normalize($url);

    // The page is trying to access is an admin page?
    $is_admin_page = isset($this->controller->params['admin']) && $this->controller->params['admin'] == true ?  true : false;

    if (!empty($url) && count($url) >= 2)
    {
        $query = $url;
        unset($query['url'], $query['ext']);
        $url .= Router::queryString($query, array());
    }
    // 403 header
    $this->controller->header("HTTP/1.0 403 Forbidden");

    // If my method is NOT an upload
    if (!preg_match('/upload/', $url))
    {
        // Write referer to session, so we can use it later
        $this->controller->Session->write('Auth.redirect', $url);
    }
    else exit; // else exit, so we prevent 302 header from redirect

    // NOTE: we can't use $this->controller->Auth->loginAction because there's no controller loaded
    $loginAction = array('controller' => 'users', 'action' => 'login');

    // If is ajax...
    if (isset($this->controller->params['isAjax']) && $this->controller->params['isAjax'] == true)
    {
        $this->controller->layout = 'ajax';

        $message = __("No tens permisos per fer aquesta acció", true);
        // If user is anonymous..
        if ( $this->controller->ISession->isAnonymous() )
        {
            // AJAX Error Message
            $message = __('La teva sessió no està iniciada.', true) 
                . ' <a href="'.Router::url($loginAction).'">' 
                . __('Fes clic aquí per iniciar-la', true) . '</a>';
        }

        $this->controller->set(compact('message'));
        $this->controller->render('error403');

        $this->controller->afterFilter();
        echo $this->controller->output;
    }
    else
    {
        $message = __("No tens permisos per fer aquesta acció", true);
        $redirect = $this->controller->referer();

        // If is anonymous...
        if ($this->controller->ISession->isAnonymous())
        {
            $message = __('La teva sessió no està iniciada.', true);
            $redirect = $loginAction;
        }
        // If user can't access the requested page, we redirect him to login
        if (!$this->controller->ISession->userCan($redirect))
        {
            $redirect = $loginAction;
        }

        // Show different auth messages for admin and user pages
        $this->controller->Session->setFlash($message, $is_admin_page ? 'default' : 'gritter', array(), 'auth');
        $this->controller->redirect($redirect, null, true);
    }
}

请记住,这是我案例的代码。您应该根据需要创建自己的error403页面。当然,你可以从我的方法开始得到它:)

相关问题