CakePHP - BaseAuthenticate改变loginRedirect

时间:2012-10-16 15:51:39

标签: php cakephp authentication cakephp-2.0

我有许多扩展BaseAuthenticate类的身份验证组件。这些是以正常方式在AppController中设置的。

身份验证组件是否可以更改AuthComponent的loginRedirect变量?

为了澄清这种情况,我的一个身份验证组件会查看某个用户子集。在检查该人是否有任何未结清的发票之前,它会检查凭证是否有效。我希望将用户重定向到给定的页面或将其完全阻止,具体取决于未完成的价值。

由于

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。 AuthComponent的重定向位置只是一个会话变量(从技术上讲,它可以在任何地方设置)。

要更改重定向位置,您可以手动设置:

$this->Session->write('Auth.redirect', 'http://example.com');

在下一个请求中,它们将由AuthComponent重定向。

或者,让您的组件重定向然后在那里:

$this->_Collection->getController()->redirect('http://example.com');

答案 1 :(得分:0)

非常感谢@jerermyharris推动我朝着正确的方向前进。这就是我最终做的事情。

<强> 1。扩展了AuthComponent

    App::uses('AuthComponent', 'Controller/Component');

    class MyAuthComponent extends AuthComponent {

      var $components = array('Session'); 

      public function identify(CakeRequest $request, CakeResponse $response) {
        if (empty($this->_authenticateObjects)) {
            $this->constructAuthenticate();
        }
        foreach ($this->_authenticateObjects as $auth) {
            $result = $auth->authenticate($request, $response);
            if (!empty($result) && is_array($result)) {
                if(isset($result['Redirect']))
                {
                    $this->Session->write('Auth.redirect', $result['Redirect']);            
                }
                return $result;
            }
        }
        return false;
      }
    }

<强> 2。添加此AppController组件

public $components = array(
        'Auth' => array(
            'className' => 'MyAuth',
        )
);

将此位添加到您为AuthComponent提供的任何其他定义。

第3。从您的身份验证组件返回重定向

App::uses('BaseAuthenticate', 'Controller/Component/Auth');

class TutorAuthenticate extends BaseAuthenticate {

    public function authenticate(CakeRequest $request, CakeResponse $response) {
        $user = ...... // However you authenticate your user
        $user['Redirect'] = "http://example.com";
        return $user;
    }
}

所以现在如果你想根据用户重定向你可以添加它,如果不这样,那么cake将遵守你在AppController中设置的指令。

哇,好像我不得不额外加载,但这是正确的做法。