cakephp 3如何使用相同的用户名/密码同时防止多个登录?

时间:2016-09-01 13:40:50

标签: cakephp cakephp-3.0

早上好,   我是第一次使用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非常完整。   所以我想知道是否有任何组件准备就绪,或者应该改变哪些配置才能工作?

非常感谢

2 个答案:

答案 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 您可以使用表会话中的数据来检查用户是否仍然连接