Я сделал это на одном из моих проектов.Пользователь когда-либо вошел в систему (как анонимный пользователь, как пользователь или как администратор) и, в зависимости от того, откуда он приходит и какие у него текущие разрешения, я показываю разные ошибки входа в систему.
Для этого ..это то, что я сделал ...
Во-первых, вам нужно использовать метод авторизации "контроллер":
$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 в соответствии с вашими потребностями.Конечно, вы можете начать с моего метода, чтобы получить его:)