торт перенаправить вход - PullRequest
       1

торт перенаправить вход

0 голосов
/ 15 сентября 2011

У меня есть пользовательский интерфейс и область администратора.Если пользователь вошел в систему и попытается перейти к URL-адресу администратора, он будет перенаправлен на страницу индекса.Я хочу перенаправить их на страницу входа администратора с сообщением для входа в систему в качестве администратора.

В некоторых случаях администратор входит в систему как пользователь, а затем пытается войти в область администратора.Я не смог переосмыслить логин администратора и дать возможность выйти и войти как admin.

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 Ответ

3 голосов
/ 15 сентября 2011

Я сделал это на одном из моих проектов.Пользователь когда-либо вошел в систему (как анонимный пользователь, как пользователь или как администратор) и, в зависимости от того, откуда он приходит и какие у него текущие разрешения, я показываю разные ошибки входа в систему.

Для этого ..это то, что я сделал ...

Во-первых, вам нужно использовать метод авторизации "контроллер":

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

С этого момента все ваши действия будут проходить через isAuthorizedметод вашего текущего контроллера.Поскольку у меня есть пользователи, группы и разрешения в моей базе данных, и у каждой группы есть разные разрешения, я создал метод isAuthorized для моего app_controller:

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

То, что я здесь делаю, проверяет разрешения пользователейчерез мой метод AppController __permitted (он просто проверяет разрешения для сеанса; если они не сохраняются в сеансе, я проверяю их в БД, а затем сохраняю их в сеансе).

Если у пользователя нет прав доступа, я показываю ему ошибку 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 в соответствии с вашими потребностями.Конечно, вы можете начать с моего метода, чтобы получить его:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...