[laravel]用户异地登录后踢掉之前的登录
不同用户和服务器之间由一个唯一的session来区分,但是一般情况下不同的session对应的用户model可以是同一个。
为了实现只能同时在一个地方登陆,可以在用户的字段里增加一个last_session来表示该用户model最近登录使用的session,每当用户进行了一次登陆操作后,把last_session重置为当前的session。然后增加一个中间件,判断每个请求使用的session是否是最近登陆的session,如果不是,返回登录页面,表示你已经被踢了。同时页面上也增加一个定时执行的ajax来判断当前的登录状态是否还有效,如果被踢了,提示并且返回登录页面。
1)重置last_session
这是登录时用的函数:
protected function attemptLogin(Request $request) {
if ($this->guard()->attempt($this->credentials($request), $request->has('remember'))){
return $this->guard()->attempt($this->credentials($request), $request->has('remember'));
}
}
登录的函数在LoginController里,但是在这个函数里重置last_session是没用的。
return时调用的attempt函数来自这里:

而且是一个只有声明(???)没有实现的函数(???)

看一下它在哪些地方使用过:

打开第一个文件,找到这个函数:

注意到下面有个sendLoginResponse函数里面执行了一个session的regenerate,猜测应该是这里产生了一个新的session替换了登录时使用的那个,于是把last_session的重置写在这里:
Auth::user()->last_session=Session::getId();
Auth::user()->save();
成功了。
2)中间件
public function handle($request, Closure $next){
if (Session::getId()!=Auth::user()->last_session){
if ($request->ajax())return response()->json(['status'=>'guoqile']);
else return redirect('login');
}
return $next($request);
}
3)页面ajax(和一个读取新消息的混在一起了)
$(document).ready(function(){
setInterval("ajaxGetNotify()", 5000)
});
//$(document).ready(ajaxGetNotify());
var title = document.title
function ajaxGetNotify(){
$.ajax({
type: 'GET',
url: 'notification_num',
dataType: 'json',
success: function(data){
var i=0;
if (data['num'] != undefined) {
if (data['num'] > 0) {
setInterval(function test() {
i++;
if (i == 1) document.title = '【新消息】' + title;
if (i == 2) document.title = '【 】' + title;
if (i == 3) i = 0;
}, 600);
}
}
if (data['status'] != undefined) {
if (data['status'] == 'guoqile') {
alert('由于账号在另一地点登录,您已被迫下线。');
location.reload();
}
}
}
});
}
[laravel]用户异地登录后踢掉之前的登录的更多相关文章
- linux 下如何查看和踢除正在登陆的其它用户 ==>Linux下用于查看系统当前登录用户信息的4种方法
在linux系统中用pkill命令踢出在线登录用户 由于linux服务器允许多用户登录,公司很多人知道密码,工作造成一定的障碍 所以需要有时踢出指定的用户 1/#who 查出当前有那些终端登录(用 ...
- Laravel用户认证系统的实现细节
原文地址:http://www.php.cn/php-weizijiaocheng-406076.html 这篇文章主要介绍了关于Laravel用户认证系统的实现细节,有着一定的参考价值,现在分享给大 ...
- Win7网上邻居提示未授予用户在此计算机上的请求登录类型解决办法
内容简介 装了Win7之后很多人遇到这样的问题,网上邻居访问Win7的电脑时出现“未授予用户在此计算机上的请求登录类型”问题.打开“控制面板”--“管理工具”--“本地安全策略”--“本地策略 ...
- windows 7 共享,未授予用户在此计算机上的请求登录类型
刚刚重装了windows7,新下载的一个ghost版本,结果却不能共享,每次访问这台机器的共享都提示, 未授予用户在此计算机上的请求登录类型 这个情况好像是存在于win7访问win7,我用一台XP系统 ...
- 关于shiro安全框架实现同一用户同一时刻仅可在一个地址登录的技术实现
首先,我们要说明一下,本技术点的开发背景是shiro与springMvc结合环境下的开发方式. 由于shiro把用户登录后的信息都存在了自己封装的session中,所以要实现单一地址登录,我们需要关注 ...
- Vue router拦截 如果用户并未登录直接跳转到登录界面(最简单的cookie演示)
router.beforeEach(function(to,from,next){ console.log('路由拦截') console.log(to.name) console.log(from. ...
- vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)
背景:后台接口返回code==501表示用户是未登录状态,需要登录才可访问: 通过http拦截做路由跳转 第一步:src目录下新建http.js文件,内容如下: import Axios from ' ...
- 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的Controller
taotao创建订单代码中之前忘了加入用户信息,那么加上呢? 分析:用户创建订单的时候,我们会强制要求用户先登录,也就是说,创建订单的Controller执行时,一定是用户已经登录了的,而用户只要登录 ...
- Identity用户管理入门六(判断是否登录)
目前用户管理的增删改查及登录功能已经全部实现,但存在一个问题,登录后要取消登录按钮显示退出按钮,未登录应该有注册按钮,现实现过程如下 一.Startup.cs中增加服务 app.UseAuthenti ...
随机推荐
- vue.js编程式路由导航 --- 由浅入深
编程式路由导航 实例中定义一个方法,这个方法绑定在标签上 然后就设置路由跳转 语法 this.$router.history.push('要跳转路由的地址') <!DOCTYPE html> ...
- 选择数字(codevs 3327)
题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input De ...
- PatentTips - Hamming distance comparison
BACKGROUND INFORMATION In a typical data processing environment, data may be transmitted in multiple ...
- WINDOWS下调用GetTokenInformation的奇怪之处--两次调用
就是用getLastErr可以得到错误号,同时,会将需要的长度写到参数里,再进行第二次调用,以此来节约内存空间. 神奇的长见识了. 相关说法如下: ====================== The ...
- 另一套备用的代码,通过service调用和登陆用户交互
结合这两个东东,应该差不多可以搞定我需要的事情啦. 因为更改不了service代码,所以希望从service调用的代码里,争脱出来,和本地登陆用户进行交互启动. #include <window ...
- Windows 10+Ubuntu 16.04在MBR分区上安装双系统(转)
以下内容转自这篇博客: http://www.cnblogs.com/Duane/p/5424218.html http://www.cnblogs.com/Duane/p/6776302.html( ...
- Oracle Multitenant Environment (一) About
About oracle mulittenant environment The multitenant architecture enables an Oracle database to func ...
- netty学习(一)--linux下的网络io模型简单介绍
linux的内核将全部的外部设备都看作一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令 ,返回一个file descriptor(fd.文件描写叙述符).而对一个socket的读写也会有对 ...
- docker Cannot start container [8] System error: exec format error
docker Cannot start container [8] System error: exec format error 学习了:https://www.aliyun.com/jiaoch ...
- sql 分组取每组的前n条或每组的n%(百分之n)的数据
sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...