У меня возникли проблемы с тем, что компонент Auth выполняет перенаправления, которые я хочу в приложении CakePHP 1.2.6.
У меня есть форма входа в систему, которая появляется на всех страницах, и я хочу, чтобы пользователь на странице, в которой он входит в систему. Например, если он просматривает профиль другого пользователя, я хочу сохранить его там после входа в систему, а не перенаправить его на $this->Auth->loginRedirect
. Кроме того, еще одна вещь о моем приложении заключается в том, что у меня нет страниц с «аутентифицированным доступом», каждая страница доступна для всех, но если вы вошли в систему, вы получаете дополнительные функции.
Из документации я понял, что мне нужно установить autoRedirect
в false, чтобы получить код в функции login ():
class UsersController extends AppController { var $name = 'Users'; var $helpers = array('Html', 'Form','Text'); function beforeFilter() { $this->Auth->autoRedirect = false; } function login() { $this->redirect($this->referer()); } function logout() { $this->redirect($this->Auth->logout()); } /* [...] */ }
изclass UsersController extends AppController { var $name = 'Users'; var $helpers = array('Html', 'Form','Text'); function beforeFilter() { $this->Auth->autoRedirect = false; } function login() { $this->redirect($this->referer()); } function logout() { $this->redirect($this->Auth->logout()); } /* [...] */ }
В настоящее время это прерывает мою аутентификацию. Я заметил (из журналов), что если оставить функцию переадресации в функции входа и установить autoRedirect
в false, поле пароля в $this->data
в функции login()
отображаться как пустое.
Ниже я разместил содержимое AppController, относящееся к компоненту Auth:
public function beforeFilter() { $this->Auth->fields = array( 'username' => 'email', 'password' => 'password' ); $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array('controller' => 'usercars', 'action' => 'homepage'); $this->allowAccess(); // build wishlist if the user is logged in if ($currentUser = $this->Auth->user()) { $wishlists = $this->buildWishlist($currentUser); $this->set('wishlists', $wishlists); } } private function allowAccess() { if(in_array($this->name, /* all my controller names */)) { $this->Auth->allow('*'); } }
Я не могу понять, что я делаю неправильно.
Добавить parent :: beforeFilter (); to beforeFilter в пользовательском контроллере:
function beforeFilter() { $this->Auth->autoRedirect = false; parent::beforeFilter(); }
Вы также можете заменить это перенаправление на метод входа вашего пользовательского контроллера:
$this->redirect($this->Auth->redirect());
Auth-> redirect () возвращает URL-адрес, куда пользователь приземлился, прежде чем перейти на страницу входа в систему или Auth-> loginRedirect.
Поместите этот код в контроллер:
function beforeFilter() { $this->Auth->allow('login', 'logout'); $this->Auth->autoRedirect = false; parent::beforeFilter(); }
и добавьте это для страницы входа:
function login() { if($this->Auth->User()) { $this->redirect(array('action'=>'welcome'), null, true); } }