[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 ...
随机推荐
- How Can You Tell the Difference Between LINQ Methods and Query Builder Methods?
LINQ's method syntax looks very similar to the query builder methods,except for one big difference:t ...
- Css学习总结(3)——CSS布局解决方案 - 水平、垂直居中、多列布局、全屏布局
居中布局 水平居中 子元素于父元素水平居中且其(子元素与父元素)宽度均可变. inline-block + text-align <div class="parent"> ...
- BNUOJ 17286 Dollars
Dollars Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 1 ...
- [luoguP1351] 联合权值(Dfs)
传送门 距离为2的点会产生权值,第一问,只需要在dfs的时候把一个点相邻的点都处理出来就行. 具体处理方式看代码,然而这样只处理了一遍,最后在乘2就好了. 第二问只需要处理一个点相邻的点中最大的和次大 ...
- noip模拟赛 遭遇
分析:暴力挺好打的,对于前30%的数据神搜,hi相同的数据将所有的建筑按照c从小到大排序,看最多能跳多少,ci=0的数据将所有的建筑按照h从小到大排序,枚举起点和终点,看能否跳这么多,取个max就可以 ...
- oracle 如何查看创建表等数据库对象时的DDL语句
http://missyou4417.blog.163.com/blog/static/78905686201271041340284/ http://www.xifenfei.com/2012/05 ...
- Mutual Training for Wannafly Union #5
A(UVA12336) 题意:给一个n*m(n,m<=1e5)的棋盘,棋盘上有一些障碍点不能放棋子,现在要在棋盘上放4个棋子,满足A->B->C->D->A,其中走的规则 ...
- MyBatis与Spring MVC结合时,使用DAO注入出现:Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
错误源自使用了这个例子:http://www.yihaomen.com/article/java/336.htm,如果运行时会出现如下错误: Invocation of init method fai ...
- 【转】java中Thread类方法介绍
原文: java中Thread类方法介绍 http://blog.csdn.net/seapeak007/article/details/53395609 这篇文章找时间分析一下!!!:http:// ...
- C#中类的详解
类定义的具体语法形式类的访问修饰符 修饰符 类名{ 类的成员} 类的访问修饰符:用于设定对类的访问权限,包括public.internal或者不写,用internal或者不写时代表只能在当前项目中访问 ...