You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在CakePHP 3.x/4.x中实现用户单日登录超5次显示提示

CakePHP 3.x/4.x 实现单日登录次数超限提示方案

1. 创建登录日志表

首先需要存储用户的登录记录,通过CakePHP的Migration创建一张login_logs表:

// src/Migrations/VersionXXXXXXXXX.php
use Migrations\AbstractMigration;

class CreateLoginLogs extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('login_logs');
        $table->addColumn('user_id', 'integer', [
            'default' => null,
            'limit' => 11,
            'null' => false,
        ]);
        $table->addColumn('login_at', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addForeignKey('user_id', 'users', 'id', [
            'delete' => 'CASCADE',
            'update' => 'CASCADE'
        ]);
        $table->create();
    }
}

执行迁移命令生成表:

bin/cake migrations migrate

2. 登录成功时写入日志

在处理登录的UsersController::login()方法中,验证用户登录成功后,记录登录日志:

// src/Controller/UsersController.php
use Cake\ORM\TableRegistry;
use Cake\I18n\DateTime;

public function login()
{
    if ($this->request->is('post')) {
        $user = $this->Auth->identify();
        if ($user) {
            // 登录成功,记录日志
            $loginLogsTable = TableRegistry::getTableLocator()->get('LoginLogs');
            $loginLog = $loginLogsTable->newEmptyEntity();
            $loginLog->user_id = $user['id'];
            $loginLog->login_at = new DateTime();
            $loginLogsTable->save($loginLog);

            $this->Auth->setUser($user);
            return $this->redirect($this->Auth->redirectUrl());
        }
        $this->Flash->error(__('用户名或密码错误,请重试'));
    }
}

3. 统计当日登录次数

在AppController中,每次请求时(比如beforeFilter方法),如果用户已登录,统计当日的登录次数:

// src/Controller/AppController.php
use Cake\ORM\TableRegistry;
use Cake\I18n\DateTime;

public function initialize()
{
    parent::initialize();
    // ... 其他初始化代码
    $this->loadComponent('Auth');
}

public function beforeFilter(\Cake\Event\EventInterface $event)
{
    parent::beforeFilter($event);
    
    if ($this->Auth->user()) {
        $userId = $this->Auth->user('id');
        $todayStart = new DateTime('today');
        $todayEnd = new DateTime('tomorrow');
        
        $loginLogsTable = TableRegistry::getTableLocator()->get('LoginLogs');
        $loginCount = $loginLogsTable->find()
            ->where([
                'user_id' => $userId,
                'login_at >=' => $todayStart,
                'login_at <' => $todayEnd
            ])
            ->count();
        
        // 将次数传递到视图
        $this->set('dailyLoginCount', $loginCount);
    }
}

4. 在视图中显示提示信息

在你的布局文件(比如src/Template/Layout/default.ctp)或者需要展示提示的视图中,添加判断逻辑:

<?php if (isset($dailyLoginCount) && $dailyLoginCount >= 5): ?>
    <div class="alert alert-warning">
        今日登录次数已达<?= $dailyLoginCount ?>次,请留意账户安全!
    </div>
<?php endif; ?>

额外注意事项

  • 时区设置:确保CakePHP的时区配置与业务需求一致,避免日期统计偏差,可在config/app.php中设置'defaultTimezone' => 'Asia/Shanghai'(根据你的实际时区调整)。
  • 日志清理:可定期清理历史登录日志,避免表数据过大,比如通过Cron任务执行删除N天前的日志记录。

内容的提问来源于stack exchange,提问作者Rihab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:38:25