我的用户表包含大量字段,其中大多数字段我不需要/想要存储在Auth用户会话中。如何限制登录用户在会话中存储哪些字段?
我知道您可以使用“包含”键选择关联模型的字段,但通常选择顶级模型的字段,您可以使用“字段”键。但在Auth的情况下,'fields'键用于选择要对用户进行身份验证的字段,而不是要在会话中包含哪些字段。
为了给出一些上下文,这里是我的代码到目前为止...我将如何做到这一点,以便只有电子邮件和名字字段存储在Auth会话中,而不是Users表中的所有字段。
$this->Auth->authenticate = array(
'Blowfish' => array(
'fields' => array(
'username' => 'email',
'password' => 'password',
)
)
);
答案 0 :(得分:2)
我赞成了有用的答案,尽管是解决方法 - 谢谢。
我认为“正确”的答案是没有办法用CakePHP Auth组件开箱即用,你必须破解它(例如,使用下面的解决方案之一)。我查看了BaseAuthenticate.php中的_findUser
方法,并确认了这一点。
如果CakePHP核心开发人员正在阅读(DeEuroMarK?),这可能是一个非常常见的要求,我认为这是一个值得内置的功能。
建议实施:只需在“字段”数组中包含您想要的字段作为额外字段 - 并假设除“用户名”和“密码”之外的每个键都是应包含在auth会话中的额外字段。这样,它与其他模型查找语法一致。
示例:
$this->Auth->authenticate = array(
'Blowfish' => array(
'fields' => array(
'username' => 'email',
'password' => 'password',
'another_field',
'yet_another_field'
)
)
);
答案 1 :(得分:1)
我已经搜索并在stackoverflow上找到了一些答案:
cakephp / don't store all user data in session while using authComponent。
它很有用。
答案 2 :(得分:1)
在我的UsersController的beforeFilter中,我有类似登录的内容。
然后我将afterLogin函数设置为重定向
$this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'afterLogin');
$this->Auth->loginRedirectTrue = array('controller' => 'users', 'action' => 'index');
$this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'display');
登录功能dus进行一些检查,然后重定向到
if ($this->Auth->login()){
// code here
$this->redirect($this->Auth->redirect());
}
像这样的和afterLogin函数
function afterLogin(){
$session = $this->Session->read('Auth');
$user_id = $session['User']['id'];
// change this to find only the fields you need and then override the Auth.User...
$user = $this->User->findById($user_id);
if (!empty($user)){
$this->Session->write('Auth.UserProfile', $user['UserProfile']);
}
$this->redirect($this->Auth->loginRedirectTrue);
}
您应该更改findById以满足您的需要,然后覆盖会话中的Auth.User字段。
祝你好运!
答案 3 :(得分:0)
我认为最简单的是添加这样的东西:
在您的Auth-Component配置中添加一个包含
$this->loadComponent('Auth', [
'authorize' => 'Controller',
'loginRedirect' => [
'controller' => 'Users',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Users',
'action' => 'login'
],
'authenticate' => [
'Form' => [
'fields' => ['username' => 'email'],
'contain' => ['Groups']
]
],
'unauthorizedRedirect' => $this->referer()
]);
...
在您的登录操作中将用户保存在会话中:
$foundUser = $this->Auth->identify();
if ($foundUser) {
$this->Auth->setUser($foundUser);
}
...
这会将包含组添加到Auth.User
是CakePhp3的版本 - 在旧版本中可能会有所不同。