Избегайте использования компонента Authe CakePHP для отображения сообщений об ошибках аутентификации - PullRequest
2 голосов
/ 10 февраля 2011

Я бы хотел избавиться от сообщений об ошибках компонента Auth, особенно от сообщения authError , которое появляется при попытке доступа к недопустимому действию.

Просто чтобы быть уверенным, я дважды проверяю, что в макете нет ни одного вызова $this->Session->flash(). Кроме того, установка пустого значения не работает, так как компонент имеет значение сообщения по умолчанию.

Я использую компонент Auth со следующей конфигурацией в классе AppController:

class AppController extends Controller {
    var $components = array(
        'Auth' => array(
            'userModel' => 'WebUser',
            'loginAction' => '/login',
            'loginRedirect' => '/',
            'logoutRedirect' => '/login',
            'autoRedirect' => false,
        ),
        'Session',
        ...
     ...
}

Для входа в систему и выхода из системы перенаправления Я настроил два маршрута:

Router::connect('/', array('controller' => 'posts', 'action' => 'index'));
Router::connect('/login', array('controller' => 'web_users', 'action' => 'login'));

Действие login в WebUser контроллер почти пуст; Я изменяю только макет по умолчанию:

function login() {
    $this->layout = 'login';
    $this->set('title_for_layout', 'Sign in');
}

Наконец, у меня есть очень простой login.ctp файл макета:

<html>
    <head>
        ...
    </head>
    <body>
        ...
        <?php echo $content_for_layout; ?>
        ...
    </body>
</html>

Когда я получаю доступ к http://example.com/login, нет проблем, нет сообщений, только форма входа в систему. Однако я получаю сообщение по умолчанию authError при запросе любого другого действия, сразу после того, как компонент Auth перенаправляет на действие login . Возникают два вопроса:

  1. Почему компонент Auth отображает флэш-сообщения, когда нигде нет вызова $this->Session->flash()? (см. Обновление 2 ниже)
  2. Как настроить пустое / нулевое значение в атрибуте authError ?

Спасибо!

UPDATE

Я пришел к действительно ужасному решению: я создал элемент login_error.ctp и назначил атрибут flashElement при инициализации компонента Auth:

class AppController extends Controller {
    var $components = array(
        'Auth' => array(
            'flashElement' => 'login_error',
        ...
     ...
}

В login_error.ctp я просто сравниваю с authError сообщением по умолчанию:

<?php if ( $message !== 'You are not authorized to access that location.' ): ?>
<div id="flashMessage" class="message"><?php echo $message; ?></div>
<?php endif; ?>

Это работает, но я ненавижу это!

ОБНОВЛЕНИЕ 2

Благодаря ответу dogmatic69 я заставил себя снова все проверить. Наконец-то я нашел, куда звонили $this->Session->flash(). Это был небольшой элемент зрения, который я написал раньше. Это не имело ничего общего с входом / выходом из системы, поэтому я не обращал на это внимание.

ОБНОВЛЕНИЕ 3

Благодаря SpawnCxy ответу также . Копирование компонента Auth и внесение пользовательских изменений - лучший подход, чем сравнение строк.

Ответы [ 7 ]

8 голосов
/ 28 июня 2012

В CakePHP 2.1 в моем AppController я использую это для переопределения моих "auth" флэш-сообщений.Вот мои $ компоненты:

  public $components = array(
      'Acl',
      'Auth' => array(
          'flash' => array(
            'element' => 'info',
            'key' => 'auth',
            'params' => array()
          ),
          'authorize' => array(
              'Actions' => array('actionPath' => 'controllers')
          ),
      ),
      'Session',
  );

Я не уверен, сможете ли вы сделать это в предыдущих версиях Cake.Кроме того, вы можете сделать:

function beforeFilter() {
  //Configure AuthComponent.
  $this->Auth->authorize = 'actions';
  $this->Auth->actionPath = 'controllers/';
  $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login', 'plugin' => NULL);
  $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'login', 'plugin' => NULL);
  $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login', 'plugin' => NULL);
  $this->Auth->authError = __('You must be logged in to view this page.');
  $this->Auth->loginError = __('Invalid Username or Password entered, please try again.');
  $this->Auth->flash = array(
    'element' => 'info',
    'key' => 'auth',
    'params' => array()
  );
}

Это тоже работает!Nice!

8 голосов
/ 10 февраля 2011

просто удалите $this->Session->flash('auth') из вида / макета.

http://book.cakephp.org/view/1467/flash

1 голос
/ 27 декабря 2012

Я только что проверил это в Cake 2.x, и оно заработало. Поместите это в функцию beforeFilter() вашего контроллера:

$this->Session->delete('Message.auth');
1 голос
/ 10 февраля 2011

Существует еще один способ сделать компонент Auth более персонализированным. Вы можете скопировать

/cake/libs/controller/components/auth.php

до

/app/controllers/components/auth.php

и отредактируйте функцию __setDefaults в новой копии. Вы можете указать свое собственное сообщение об ошибке аутентификации, изменив значение ключа authError в $defaults. Установите пустую строку, если хотите ничего не показывать.

0 голосов
/ 17 мая 2017

У меня была похожая проблема, но я использую CakePHP 3.4. Я решил редактировать config/routes.php:

//$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
$routes->redirect('/', ['controller' => 'Users', 'action' => 'login']);
0 голосов
/ 11 февраля 2014

Я практикую другой лучший способ, чем Ответ Янга AppController установите следующий код:

function beforeFilter(){
    ... ... ...
    //set auth message custom id, if required.
    $this->Auth->flash['key'] = 'YOUR-ID-HERE';
    //set auth message custom attributes e.g. class etc., if required
    $this->Auth->flash['params']=array('class'=>'YOUR-CLASS-HERE');
    //set auth message custom element path, if required
    $this->Auth->flash['element'] = 'YOUR-ELEMENT-PATH-HERE';
    ... ... ...
}

Я надеюсь, что это будет лучше, чем настройка Core Libraries для простой работы.

0 голосов
/ 18 июля 2013

У меня был похожий сценарий.

Когда пользователь вошел в систему, '/' направляет действие на панель мониторинга в контроллере.Однако когда пользователь не вошел в систему, я хотел, чтобы он мог запросить либо mydomain.com, либо mydomain.com/users/login без получения сообщения authError.

Еслипользователь запросил любую другую страницу, однако я хотел, чтобы сообщение authError «не авторизовано» отображалось как обычно.

Вот мое решение: в beforeFilter в AppController

if($this->request->here == '/' && !$this->Auth->loggedIn()){
    $this->Auth->allow('dashboard'); //temporarily allow the dashboard action
    $this->redirect(array('controller' => 'users', 'action' => 'login'));   //manually redirect to login screen
}

Из-за способа работы маршрутов, если пользователь запросит '/', он не получит ошибку аутентификации.Однако, если они запрашивают / controller_name / dashboard, они получат сообщение об ошибке аутентификации, потому что $ this-> Auth-> allow ('dashboard') срабатывает только если они запрашивают '/'.

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