文档章节

Laravel --进阶篇 (单用户登录)

zhiqiangw
 zhiqiangw
发布于 2016/10/06 11:03
字数 877
阅读 18
收藏 0
点赞 0
评论 0

为什么要单用户登录? 比如: 视频教程网站, 如果一个帐号买了1个课程, 然后在把自己的帐号共享给其他人, 那其他人也能在他看视频的同时也登录他的账号看视频了, 那公司的利益就受到了损失, 那帐号如果分给 1000 人, 10000 人, 这损失就不小,如果做了单用户 就起码可以保证每个账号只能同时一个人登录 那么今天带着大家做一下单点登录的实例。

涉及技术

  • Laravel
  • 路由
  • 中间件
  • Redis

这里我使用的 Laravel 5.1 LTS 框架, 登录逻辑, 挺简单的这里就简单的阐述下, 我们只要在登录成功之后做一点 手脚

登录

// 登录验证
$result = \DB::table('user_login')->where(['username' => $input['username'], 'password' => $input['pass']])->find();
  ...
  ...
  // 该地方为登录验证逻辑
if ($result) {  
   # 登录成功
   // 制作 token
   $time = time();
   // md5 加密
   $singleToken = md5($request->getClientIp() . $result->guid . $time);
   // 当前 time 存入 Redis
   \Redis::set(STRING_SINGLETOKEN_ . $result->guid, $time);
   // 用户信息存入 Session
   \Session::put('user_login', $result);
   // 跳转到首页, 并附带 Cookie
   return response()->view('index')->withCookie('SINGLETOKEN', $singletoken);
} else {
   # 登录失败逻辑处理
}

我来解释一下: 首先登录成功之后, 得到目前时间戳, 通过 IPtime, 和 查询得出用户的 Guid 进行 MD5 加密, 得到 TOKEN 然后我们将刚刚得到的时间戳, 存入 Redis Redis Key 为字符串拼接上 Guid, 方便后面中间件的 TOKEN 验证, 然后我们把用户信息存入 Session 最后我们把计算的 TOKEN以 Cookie 发送给客户端.

中间件

我们再来制作一个中间件, 让我们用户每一次操作都在我们掌控之中.

// 项目根目录运行
php artisan make:middleware SsoMiddleware  

上面个命令会在 app/Http/Middleware 下面生成一个 SsoMiddleware.php 文件, 将中间件添加到 Kernel.php

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'SsoMiddleware' => \App\Http\Middleware\index\SsoMiddleware::class,
    ];

现在到中间件中写程序 app/Http/Middleware/SsoMiddleware.php, 在文件中有 handle 方法, 我们在这个方法中写逻辑.

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $userInfo = \Session::get('user_login');
        if ($userInfo) {
            // 获取 Cookie 中的 token
            $singletoken = $request->cookie('SINGLETOKEN');
            if ($singletoken) {
                // 从 Redis 获取 time
                $redisTime = \Redis::get(STRING_SINGLETOKEN_ . $userInfo->guid);
                // 重新获取加密参数加密
                $ip = $request->getClientIp();
                $secret = md5($ip . $userInfo->guid . $redisTime);
                if ($singletoken != $secret) {              
                    // 记录此次异常登录记录
                    \DB::table('data_login_exception')->insert(['guid' => $userInfo->guid, 'ip' => $ip, 'addtime' => time()]);
                    // 清除 session 数据
                    \Session::forget('indexlogin');
                    return view('/403')->with(['Msg' => '您的帐号在另一个地点登录..']);
                }
                return $next($request);
            } else {
                return redirect('/login');
            }
        } else {
            return redirect('/login');
        }
    }

上面中间件之中做的事情是: 获取用户存在 Session 之中的数据作为第一重判断, 如果通过判断, 进入第二重判断, 先获取我们登录之后发送给用户的Cookie 在 Cookie 之中会有我们登录成功后传到客户端的 SINGLETOKEN 我们要做的事情就是重新获取存入 Redis 的时间戳, 取出来安顺序和 IP, Guid, time MD5 加密, 加密后和客户端得到的 Cookie 之中的 SINGLETOKEN 对比.

路由组

我们逻辑写完了, 最后一步就是将用户登录后的每一步操作都掌控在自己手里, 这里我们就需要路由组

// 有 Sso 中间件的路由组
Route::group(['middleware' => 'SsoMiddleware'], function() {  
      # 用户登录成功后的路由
}

© 著作权归作者所有

共有 人打赏支持
zhiqiangw
粉丝 12
博文 191
码字总数 142634
作品 0
郑州
程序员
Laravel --进阶篇(单点登录 SSO)

单点登录 SSO ( Single Sign On ) 这个术语大家都听说过, 为什么要单点登录? 比如: 视频教程网站, 如果一个帐号买了1个课程, 然后在把自己的帐号共享给其他人, 那其他人也能在他看视频的同时...

QIANG008 ⋅ 2016/09/27 ⋅ 0

TODO:Laravel 内置简单登录

TODO:Laravel 内置简单登录 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管理的系统,例如公司内部用的简...

OneTODO ⋅ 2016/12/20 ⋅ 0

php&go&python&node

2016 第二届 PHP 全球开发者大会回顾(文末附演讲嘉宾所有资料下载) 继前年的 “PHP7 初探”、去年的“高性能的 PHP ” 主题后,2017 第三届 PHP 全球开发者大会的活动主题是“高可用的 PH...

掘金官方 ⋅ 2017/12/20 ⋅ 0

CentOS7上快速搭建FTP服务器,基于本地用户访问

本篇文档主要讲基于Linux上本地用户进行访问的FTP服务器的快速搭建步骤。 如果是想进阶学习FTP,如基于mysql的虚拟用户的配置,不应该参考本篇文档。 参考文档:http://www.178linux.com/526...

黎晨 ⋅ 2017/05/24 ⋅ 0

Laravel学习资源

2014国庆期间开始学习laravel,以前只会用CI,没有想到这东东学习理解起来,比CI难度(主要还是自己PHP水平不够)。 学习、模索laravel过程中,收集到一些与laravel有关的资料(开源项目、文档等...

OpenIoT ⋅ 2014/10/06 ⋅ 3

Laravel 5.1 + OAuth2 PasswordGrant(密码授权模式)

背景简述 本文意在搭建一个通用的应用后端服务环境, 账号验证是应用的基础环境之一. OAuth2可提供安全的验证环境, 以accesstoken作为访问安全资源的令牌, 作为单一的应用端与后端的交互方式,...

黑狗007 ⋅ 2015/10/22 ⋅ 9

ZHENFENGSHISAN/perfect-ssm

Quick Start 项目简介 ssm系列 ssm-demo:Spring+SpringMVC+Mybatis+easyUI整合 perfect-ssm:RESTful API+redis缓存 ssm-cluster:前后端分离+集群部署 ssm-dubbo:dubbo服务化 ssm-micro-se......

ZHENFENGSHISAN ⋅ 2017/09/18 ⋅ 0

zfeig/laravel-blog

基于laravel4.2开发的博客系统,完善的前台和后台 前端采用bootstrap响应式布局,后端手写普通布局,以及artdailog弹窗,构建了简单简洁的后台界面,实现了文章,文章标签,文章分类,文章搜...

zfeig ⋅ 2016/04/28 ⋅ 0

程序猿成长计划--growing-up

程序猿成长计划 程序员成长计划包含了作为一名程序猿成长过程中的所学,我把这些以教程的形式开源出来,供大家一起学习、补充,共同成长。 三十分钟学会AWK Docker学习笔记-基础命令 一小时学...

mylxsw ⋅ 2016/11/30 ⋅ 0

Laravel5学生成绩管理系统-03-登陆登出功能-权限-中间件

 这一节,我们完成登录登出的功能, 在路由中设置中间件, 过滤一些非法请求,关于中间件、用户授权请参靠官方文档,如果是新手,强烈建议先看下文档然后再开始下面的工作。 #知识学习: HTTP...

Corwien ⋅ 2016/04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部