早上好, 我是第一次使用cakephp 3,我想知道如何防止两个或更多人同时使用相同的用户名登录?
我使用auth组件登录和注销,一切都运行得很好。
研究并了解需要使用Sessions,然后将以下内容作为Cookbook: 在app.php中:
'Session' => [
'defaults' => 'database'
]
并创建了表格:
CREATE TABLE `sessions` (
`id` varchar(255) NOT NULL DEFAULT '',
`data` BLOB, -- or BYTEA for PostgreSQL
`expires` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
它将会话保存在数据库中。但仍然允许相同的用户名同时连接到sistem多次,例如我在localhost上测试,两个浏览器使用相同的用户名登录。
我发布了这个问题因为我不喜欢重新发明轮子,我知道cakephp非常完整。 所以我想知道是否有任何组件准备就绪,或者应该改变哪些配置才能工作?
非常感谢
答案 0 :(得分:0)
然后我创建了这个字段的数据库:
id_logged varchar 15,
登录功能如下所示:
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$idsessao = uniqid();
$query = $this->Users->query();
$query->update()
->set(['id_logged' => $idsessao])
->where(['id' => $user['id']])
->execute();
$user['id_logged'] = $idsessao;
$this->Auth->setUser($user);
return $this->redirect([
'controller' => 'x',
'action' => 'x'
]);
} else{
$this->Flash->error(__('x'));
}
}
}
并在每个控制器内部使用:
public function isAuthorized($user)
{
if ($this->request->action != 'index') {
return true;
}
$usuario = $this->request->session()->read('Auth.User');
$idbanco = (new UsersController())->id_logged_db();
if ($idbanco != $usuario['id_logged']){
$this->Flash->error(__('x'));
return $this->redirect($this->Auth->logout());
}
return parent::isAuthorized($user);
}
id_logged_db函数是这样的:
public function id_logged_db(){
$this->autoRender = false;
$usuario = $this->request->session()->read('Auth.User');
$id = $this->Users->get($usuario['id'])->id_logged;
return $id;
}
这样,每次用户访问索引动作时,系统都会在登录时测试id保存。
它完全按照我的需要工作。
我通过发布答案,所以你可以帮助有同样疑问的人。
答案 1 :(得分:-1)
在您的usersController登录操作中尝试此操作
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$userInfo = $this->request->session()->read('Auth.User');
if(!$userInfo['is_logged']){
//Update the row is_logged to true
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}else{
$this->Flash->error(__('Your are already connected'));
}
$this->Flash->error(__('Invalid username or password, try again'));
}
}
}
添加额外的行" is_logged"到你的用户表
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(255),
role VARCHAR(20),
is_logged BOOL,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
运行一个cron作业或脚本,在一小时后重置行is_logged 您可以使用表会话中的数据来检查用户是否仍然连接