0

我已经设置了一个忘记密码的场景,用户提交电子邮件地址,获取发送给他们的临时密码,然后用户单击要发送到用户编辑功能的链接,以将密码更改为他们可以记住的密码。我在 url 中传递临时通行证。

我调试了我能做的事情,它似乎正在结帐,但仍然不允许未登录的用户访问编辑方法。它似乎只授权登录用户(如果他们忘记了密码,因此无法登录,你可以看到我的问题)。

那么,如果临时通道与 url 的 id 参数匹配,您将如何允许访问控制器方法?

is授权功能:

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

我刚刚想通了。我在我的前过滤器中添加了“编辑”操作,以便任何人都可以访问它,无论是否登录,然后在编辑功能中我只是添加了检查,真的很简单,但由于某种原因我无法想到它.

内部编辑功能:

    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

我认为理想情况下,您可以在控制器中将其设置为两个单独的操作,以便您可以将编辑页面设置为仅用于实际用户编辑,将重置密码页面设置为仅用于重置密码。

然后就做(在你的控制器中)......

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 回答