Как разрешить действие контроллера в CakePhp 3.x, если временный пароль в URL проходит проверку?

Я настроил сценарий забытого пароля, в котором пользователь отправляет адрес электронной почты, получает временный пароль, отправленный ему, и пользователь щелкает ссылку для отправки в функцию редактирования пользователя, чтобы изменить пароль на то, что он может запомнить. Я передаю временную передачу в URL.

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

Итак, как бы вы разрешили доступ к методу контроллера, если временный проход совпадает с параметром id URL?

isAuthorized функция:

public function isAuthorized($user = null)
{
if (isset($user['role']) && $user['role'] === 1 ) {
return true;
}
if ( $this->request->action === 'edit' ) {
$paramId = (int)$this->request->pass;
$logged_out_user = $this->Users->get($paramId);
if ( password_verify($this->request->query('pass'), $logged_out_user->password) === true ) {
return true;
} else {
return $this->redirect($this->Auth->redirectUrl());
}
}
return parent::isAuthorized($user);
}

пример ссылки на адрес: http://localhost/site/users/edit/1?pass=o1eNbs5l7GlHlqvPAmU.

0

Решение

Я просто понял это. Я добавил действие «edit» в свой beforefilter, чтобы любой мог получить к нему доступ, вошел ли он в систему или нет, затем в функцию edit я просто добавил проверки, довольно просто, но по какой-то причине я не смог об этом думать ,

функция редактирования внутри:

    if ($this->request->session()->read('Auth.User')) {
if ( $user->id === $this->request->session()->read('Auth.User.id') || $this->request->session()->read('Auth.User.role') === 1 ) {
$this->Auth->allow();
} else {
$this->Flash->error(__('You do not have access to that page.'));
return $this->redirect(['action' => 'login']);
}
} elseif ( !empty($this->request->query('pass')) && password_verify($this->request->query('pass'), $user->password) === true ) {
$this->Auth->setUser($user->toArray());
} else {
$this->Flash->error(__('You do not have access to that page.'));
return $this->redirect(['action' => 'login']);
}
if ( !empty($this->request->query('pass')) && password_verify($this->request->query('pass'), $user->password) === true ) {
$user->old_password = $this->request->query('pass');
}
0

Другие решения

Я думаю, что в идеале вы должны сделать это двумя отдельными действиями в контроллере, чтобы вы могли сделать свою страницу редактирования только для реального редактирования пользователем, а страницу сброса пароля — только для сброса пароля.

Тогда просто сделайте (в вашем контроллере) …

public function initialize()
{
parent::initialize();
$this->Auth->allow(['reset_password']);
}

Это предполагает, что вы заставите свой контроллер сбросить пароль, как это …

public function reset_password($pass = false) {
if (password_verify($pass)) {
// show password reset form
} else {
$this->redirect(['action' => 'key_required_or_expired']);
}
}
0

По вопросам рекламы [email protected]