本文介绍的是利用Laravel事件系统实现登录日志记录的相关内容,分享出来给大家参考,下面来看看详细的介绍:

明确需求

记录一个登录日志,通常需要下列信息:

客户端Agent信息

客户端IP地址

访问IP地点

登录时间

登录用户信息

确立工具

明确完需求后,根据每个需求查找自己所需的工具吧。

需求1 jenssegers/agent就可以满足我们要求

需求2 Laravel下直接Request::getClientIp()

需求3 zhuzhichao/ip-location-zh这个包可以满足要求

需求4 time()

需求5 登录用户模型

开工

采用Laravel的事件订阅系统来实现,需要实现一个登录事件和一个登录事件监听器。

生成事件和监听器

Laravel命令行支持自动生成事件和监听器,在App\Providers\EventServiceProvider中添加需要实现的事件:

protected $listen = [

...,

//添加登录事件及对应监听器,一个事件可绑定多个监听器

'App\Events\LoginEvent' => [

'App\Listeners\LoginListener',

],

];

运行命令:php artisan event:generate就会自动生成事件和监听器,已存在的事件和监听器不会发生改变。

登录事件(Event)

回顾下需求,我们的登录事件需要的5点信息,在事件中需要记录这些信息,所以事件设计如下:

namespace App\Events;

use Illuminate\Broadcasting\Channel;

use Illuminate\Queue\SerializesModels;

use Illuminate\Broadcasting\PrivateChannel;

use Illuminate\Foundation\Events\Dispatchable;

use Illuminate\Broadcasting\InteractsWithSockets;

use App\Models\User;

use Jenssegers\Agent\Agent;

class LoginEvent

{

use Dispatchable, InteractsWithSockets, SerializesModels;

/**

* @var User 用户模型

*/

protected $user;

/**

* @var Agent Agent对象

*/

protected $agent;

/**

* @var string IP地址

*/

protected $ip;

/**

* @var int 登录时间戳

*/

protected $timestamp;

/**

* 实例化事件时传递这些信息

*/

public function __construct($user, $agent, $ip, $timestamp)

{

$this->user = $user;

$this->agent = $agent;

$this->ip = $ip;

$this->timestamp = $timestamp;

}

public function getUser()

{

return $this->user;

}

public function getAgent()

{

return $this->agent;

}

public function getIp()

{

return $this->ip;

}

public function getTimestamp()

{

return $this->timestamp;

}

/**

* Get the channels the event should broadcast on.

*

* @return Channel|array

*/

public function broadcastOn()

{

return new PrivateChannel('channel-default');

}

}

在事件中记录所需要的信息,并实现这些信息的get方法。

登录监听器(Listener)

在监听器中,获取到事件传递过来的信息,把这些信息记录到数据库中,实现如下:

namespace App\Listeners;

use App\Events\LoginEvent;

class LoginListener

{

// handle方法中处理事件

public function handle(LoginEvent $event)

{

//获取事件中保存的信息

$user = $event->getUser();

$agent = $event->getAgent();

$ip = $event->getIp();

$timestamp = $event->getTimestamp();

//登录信息

$login_info = [

'ip' => $ip,

'login_time' => $timestamp,

'user_id' => $user->id

];

// zhuzhichao/ip-location-zh 包含的方法获取ip地理位置

$addresses = \Ip::find($ip);

$login_info['address'] = implode(' ', $addresses);

// jenssegers/agent 的方法来提取agent信息

$login_info['device'] = $agent->device(); //设备名称

$browser = $agent->browser();

$login_info['browser'] = $browser . ' ' . $agent->version($browser); //浏览器

$platform = $agent->platform();

$login_info['platform'] = $platform . ' ' . $agent->version($platform); //操作系统

$login_info['language'] = implode(',', $agent->languages()); //语言

//设备类型

if ($agent->isTablet()) {

// 平板

$login_info['device_type'] = 'tablet';

} else if ($agent->isMobile()) {

// 便捷设备

$login_info['device_type'] = 'mobile';

} else if ($agent->isRobot()) {

// 爬虫机器人

$login_info['device_type'] = 'robot';

$login_info['device'] = $agent->robot(); //机器人名称

} else {

// 桌面设备

$login_info['device_type'] = 'desktop';

}

//插入到数据库

DB::table('login_log')->insert($login_info);

}

}

这样,监听器就完成了,每次一触发登录事件,就会在数据库中添加一条登录信息。

触发事件

通过全局的event()方法来触发事件,event()方法的参数为事件实例:

namespace App\Controllers;

...

use App\Events\LoginEvent;

use Jenssegers\Agent\Agent;

class AuthControoler extends Controller

{

...

public function login(Request $request)

{

//登录实现

...

//登录成功,触发事件

event(new LoginEvent($this->guard()->user(), new Agent(), \Request::getClientIp(), time()));

...

}

}

队列化监听器

有时监听器会进行一些耗时操作,这时应该结合Laravel的队列系统将监听器进行队列化,前提是已经配置了队列并开启了队列处理器。

队列化非常简单,只需监听器实现ShouldQueue接口即可,即:

namespace App\Listeners;

...

use Illuminate\Contracts\Queue\ShouldQueue;

class LoginListener implements ShouldQueue

{

/**

* 失败重试次数

* @var int

*/

public $tries = 1;

...

}

总结

Laravel的事件系统实现起来还是非常优雅的,同一个事件可以很方便的添加各类监听器,且各个监听器之间互不干扰,解耦性非常强。加上队列系统,可以很方便的处理一些后续任务。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

用php实现登录日志,利用Laravel事件系统如何实现登录日志的记录详解相关推荐

  1. webpack打包后引用cdn的js_利用CDN加速react webpack打包后的文件详解

    此文不介绍webpack基本配置,如果对基本配置有疑问请查阅官方文档. 1.配置webpack.config.js 将output.publicPath改成上传到的cdn地址, 例(对应上面上传配置) ...

  2. awk命令详解_python学习之利用urllib和urllib2访问http的GET/POST详解

    前言 本文主要给大家介绍了关于python如何学习访问http的GET/POST的相关内容,使用urllib和urllib2,可以轻松实现对http的访问,下面话不多说了,来一起看看详细的介绍吧. 示 ...

  3. php laravel入口文件,Laravel学习教程之从入口到输出过程详解

    php 的 Laravel学习教程之从入口到输出过程详解 本文主要给大家介绍了关于Laravel从入口到输出过程的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. I. 预备 ...

  4. win10装linux虚拟机contos,利用win10自带虚拟机hyper-v安装centos7方法详解

    一.安装win10企业版自带虚拟机 hyper-v 1.控制面板-->程序和功能-->启用或关闭Windows功能 勾上 hyper-v 确定就ok了 2.安装成功后会发现在 左下角&qu ...

  5. 制作gif动图python_利用Python如何制作好玩的GIF动图详解

    前言 之前我们分享过用Python进行可视化的9种常见方式.其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表. 假如电脑上没有 ...

  6. Java=微信支付详解与日志记录详解

    一.二维码: (1)什么是二维码 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示 ...

  7. php 微信登录并绑定,Laravel 集成微信用户登录和绑定的实现

    最近主要在忙活微信与支付宝平台的对接与开发,本篇就基于后端层面来讲述一下微信的登录与绑定实现. (一).申请微信开放平台 最首先的话就是需要去微信开发中心,创建一个账号,然后创建自己的移动或网站应用. ...

  8. 90.网络安全渗透测试—[常规漏洞挖掘与利用篇6]—[文件包含-PHP封装伪协议详解实战示例]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.文件包含-PHP封装伪协议简介 1.php内置封装协议 2.data://命令执行-伪协议 3.zip:// ...

  9. php oauth2 认证,laravel之passport oauth2认证之授权码详解

    包地址 composer require laravel/passport 1.0.* config/app.php Laravel\Passport\PassportServiceProvider: ...

最新文章

  1. java最最长的错误,Java开发中遇到最多的异常是什么?最后一个最多最难!
  2. Select下拉列表框(添加、删除option)
  3. desktop docker 无法卸载_docker,生信人的福音!
  4. java修车_JAVA小练习34——使用java描述一个车类与一个修车厂类
  5. 装饰器模式(讲解+应用)
  6. ./configure会报错:pr command not found
  7. MYSQL(3)---MySQL的基本概念介绍
  8. 惠普光影精灵拆机换屏幕_聊聊惠普游戏本大军的“先遣部队”
  9. global.css
  10. 一些关于大数据的总结
  11. 分布式监控报警平台Centreon之:Centreon简介
  12. 手把手让你实现postfix+extmail+mysql虚拟用户邮件体系
  13. 牛客编程巅峰赛S2第7场 - 钻石王者
  14. 算法设计和数据结构学习_2(常见排序算法思想)
  15. 【基础知识】【中缀转逆波兰(后缀)表达式】
  16. 信用评分-(scorecard)记分卡开发流程,详细介绍分数校准原理calibration
  17. Java书籍推荐(这些书你看过几本?)
  18. 特斯拉开始发布其汽车的开源Linux软件代码
  19. Excel金额大小写转换公式
  20. 5G China unicom 一般性异常处理

热门文章

  1. mos 多路模拟电子开关_【原创】单火线智能开关技术介绍及分析
  2. 在Java生成的html页面加水印,Java在Excel中添加水印的实现(单一水印、平铺水印)...
  3. 计算机三级网络技术知识点大纲,全国计算机等级考试三级网络技术考试大纲(2019年版)...
  4. 解决浏览器刷新vuex数据丢失问题
  5. 装饰器,闭包,高阶函数,嵌套函数
  6. jQuery Dom 操作,动态生成dom,绑定事件
  7. Spring Security构建Rest服务-0100-前言
  8. Docker(十二):Docker集群管理之Compose
  9. GDB调试汇编堆栈过程分析
  10. zabbix配fpmmm(mpm)数据传送不了问题解决