0

ユーザーがメールアドレスを送信し、一時的なパスワードが送信され、ユーザーがリンクをクリックしてユーザーの編集機能に送信され、パスワードを覚えやすいものに変更する、パスワードを忘れるシナリオを設定しました。URLで一時パスを渡しています。

できることをデバッグしましたが、チェックアウトしているように見えますが、ログインしていないユーザーが編集メソッドにアクセスすることはまだ許可されていません。ログインしたユーザーに対してのみ承認するようです (パスワードを忘れてログインできない場合、私の問題を見ることができます)。

一時パスが URL の id パラメータと一致する場合、コントローラ メソッドへのアクセスをどのように許可しますか?

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.

4

2 に答える 2

0

私はちょうどそれを理解しました。「編集」アクションを beforefilter に追加して、ログインしているかどうかに関係なく誰でもアクセスできるようにし、編集機能でチェックを追加しました。これは非常に単純ですが、何らかの理由でそれを考えることができませんでした.

内部編集機能:

    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');
    }
于 2015-10-29T14:57:02.057 に答える
0

理想的には、実際のユーザー編集専用の編集ページと、パスワードのリセット専用のパスワード リセット ページを作成できるように、コントローラーで 2 つの別個のアクションにすることをお勧めします。

次に、(コントローラーで)行うだけです...

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']);
   }
}
于 2016-04-04T00:35:10.420 に答える