在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
相关产品推荐
相关产品推荐

