我有许多扩展BaseAuthenticate
类的身份验证组件。这些都是以正常方式在 AppController 中设置的。
身份验证组件是否可以更改 AuthComponent 的 loginRedirect 变量?
为了澄清这种情况,我的一个身份验证组件查看了用户的某个子集。在检查该人是否有任何未结发票之前,它会检查凭据是否有效。根据突出的价值,我想将用户重定向到给定的页面或完全阻止它们。
谢谢
我有许多扩展BaseAuthenticate
类的身份验证组件。这些都是以正常方式在 AppController 中设置的。
身份验证组件是否可以更改 AuthComponent 的 loginRedirect 变量?
为了澄清这种情况,我的一个身份验证组件查看了用户的某个子集。在检查该人是否有任何未结发票之前,它会检查凭据是否有效。根据突出的价值,我想将用户重定向到给定的页面或完全阻止它们。
谢谢
是的,这是可能的。AuthComponent 的重定向位置只是一个会话变量(因此从技术上讲,它可以在任何地方设置)。
要更改重定向位置,您可以手动设置:
$this->Session->write('Auth.redirect', 'http://example.com');
在下一个请求中,它们将被 AuthComponent 重定向。
或者,让您的组件在那时和那里重定向它们:
$this->_Collection->getController()->redirect('http://example.com');
非常感谢@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 中设置的指令。
哇,这似乎我不得不做额外的工作,但这是正确的做法。