澳门新浦京8455com初涉扫码登录:edusoho实现客户端扫码登录(简版)

澳门新浦京8455com 11

帝国CMS默认的评论功能太垃圾了,不管登没登录,评论框那都显示一个登录框,总之很不好。

几经周折终于把mantis的安装成功了,还是有必要再次介绍一下安装步骤。因在安装过程中找到的安装文
档都比较old已经不适合最新的版本了。本人曾在去年成功安装了Linux环境下的mantis并与svn、 testlink相结合,因此说,对mantis算是有些了解,虽不善技术,但能有点小运气,遇到的问题都逐个解
决了。现在和大家分享一下经验成果。望兹鼓励,转载请注明出处。

一、项目简介及需求

一流资源网给稍微修改了一下:

 
edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录。不多修改edusoho代码的原因是为了避免下次升级主版本时发生错误。

1、如果是未登录状态,默认就勾选“匿名登录”,旁边也可以进行 登录 注册
操作。

截至到2008.8月底,有新版本如不适用,请参考使用。

二、版本信息及所需应用

2、如果是已经登录状态,就直接显示
登录用户名,以登录账户评论。但同样可以勾选“匿名登录”,以匿名方式评论。

1         环境:

edusoho 7.5.14

这样是不是很不错呢。。。

(这个一定要明确滴,很多童鞋的版本不一致,会出现问题)

WindowsXP SP2
IIS 5

MySQL5.1(注:因MySQL6在mantis安装数据库时,脚本中带有TYPE=MyISAM而不能正确安装。)

PHP5.2.6(目前最新版)

Mantis1.1.2(1.2.0尚未正式发布,还有bug,我使用发现“报告问题”的时候也页面不停的跳转,故使用低版本)

Jpgraph2.3.3(目前最新版)

小贴士:

TYPE=MyISAM 和
ENGINE=MyISAM 都是设置数据库存储引擎的语句

老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE =
MYISAM)。

MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。

一般地,ENGINE
选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。

windows下Mysql6安装mantis1.2.0,建库时报错:TYPE=MyISAM

Schema CreateTableSQL ( mantis_config_table )
BAD

CREATE TABLE mantis_config_table ( config_id
VARCHAR(64) NOT NULL, project_id INTEGER NOT NULL DEFAULT 0, user_id
INTEGER NOT NULL DEFAULT 0, access_reqd INTEGER DEFAULT 0, type INTEGER
DEFAULT 90, value LONGTEXT NOT NULL, PRIMARY KEY (config_id,
project_id, user_id) )TYPE=MyISAM

You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near ‘TYPE=MyISAM’ at line 9

这是因为用的是mantis1.2.0或者1.1.2,执行install的时候,建库脚本报错。

网上查询到的解决办法:“我在mysql的字符集设置一节找到了解决办法,解决办法是这样的,修改 mantis提供的db_generate.sql,把所有的TYPE=MyISAM都替换成TYPE=MyISAM
CHARACTER SET utf8;然后再重新创建数据库,这样就可以输入中文了,如果已经创建了数据库,只能把原来的数据库删除重新创建.

上面是旧的方法,因为mantis现在已经没有单独的sql脚本了,所以可以在建库的时候勾选倒数第二项,先生成一个脚本,按照上面的方法修改,手动在mysql中执行一下,就没有问题,我试过,行得通。

 

php   5.5.25

方法如下:

2         下载准备:

php   GD库

第一步:下载附件中的loginjs-pl.php 文件,上传到/e/member/login/ 目录,

2.1         下载相关的安装包

mantis-1.1.2.zip

php-5.2.6-win32-installer.msi

mysql-5.1.26-rc-win32.zip

jpgraph2.3.3.rar

 

memcache(本次使用memcache作为存储介质,可用redis代替)
点我下载

第二步:在评论框要显示 这块的位置使用以下代码调用:

2.2         安装配置IIS

第一步(查询):在“控制面板→管理工具”查看是否有“Internet信息服务”这个功能,如果没有说明,尚未添加IIS服务。

第二步(安装):在“控制面板→添加/删除程序→添加/删除windows组件”弹出选择框“windows组件向导”勾选“Internet信息服”即IIS,如图一。

澳门新浦京8455com 1

图一

选择好之后,单击“下一步”,弹出提示框“插入磁盘”,单击“确定”。会让用户输入所需文件位置,如果你有一张windows的安装盘,那么直接选择相应的位置,即一个i386的文件夹。继续安装即可。

如果没有安装盘,可以事先下载一个“IIS服务安装包完整版(Win2000/XP/2003)”安装包解压缩,然后选择解压缩后的位置即可。

点击上面的地址能够下载“IIS服务安装包完整版(Win2000/XP/2003)”

其中,会有几次提示,要找相应的文件,请您手动选择,都在那个压缩包中。

耐心等待一下,IIS就自动安装完毕了。“控制面板→管理工具”中可以看到有“Internet信息服务”

第三步(配置):(安装过IIS的童鞋请直接看这)

打开“Internet信息服务”→“本地计算机→网站→默认网站”,右键,“新建→虚拟目录”,如图二

 

澳门新浦京8455com 2

图二

下一步,按照提示,依次输入“别名”“网站内容目录”。

添加站点完毕,选中该站点并点击右键“属性→文档”添加一个mantis登录时php的默认页面index.php,如图三,

 

澳门新浦京8455com 3

图三

配置完毕。

小贴士:

如果不想使用默认端口80

可以在“默认网站”右键“属性”中,“网站”选项卡的TCP端口,修改默认的80端口为需要的端口(如8080)如图四

 

澳门新浦京8455com 4

图四

 

phpqrcde(php生成二维码插件)

scriptsrc=/e/member/login/loginjs-pl.php/script

2.3         安装配置MySQL5.1

双击setup.exe,开始安装咯~~

安装:

选择系定义安装“custom”为了下一步“选择安装的目录”

MySQL Server的安装目录就安装在c盘下C:/MySQL Server
5.1/,即可。

MySQL Server Datafiles建议安装到d盘D:/MySQL_DATA/,防止c盘空间不够。

之后MySQL会自动安装,并进入到配置阶段。

勾选“Configure the MySQL Server now”进入配置。

选择“Detailed Configuration”→“Server Machine”→“Multifunctional
Database”→“InnoDB Tablespace
Settings”→“Decision
Support(DSS)/OLAP”默认→“Enable TCP/IP
Networking”默认3306(设置网口)→选择“Manual Selected Default
Character Set/Collation”(选择默认语言utf-8)→“Install As Windows
Service”默认(是否安装为windows的服务,随系统启动)→设置root用户密码。好了,配置完毕。

 

小贴士:

InnoDB 给 MySQL
提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash
recovery capabilities)、多版本并发控制(multi-versioned concurrency control)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行级锁(locking on
row level),提供与 Oracle
类似的不加锁读取(non-locking read in
SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock
escalation),因为 InnoDB
的行级锁定(row level
locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

InnoDB
的设计目标是处理大容量数据库系统,它的 CPU
利用率是其它基于磁盘的关系数据库引擎所不能比的。它自身也有些缺陷,6.x版本以前,在多核CPU的情况下,性能提升并不是太多。

 

 

说明:1、在 loginjs-pl.php 文件中可以修改样式。

2.4         安装PHP

在“Web Server Setup”页选择“iis isapi module”

在“Choose Items to Install”页,选择“Extensions”→安装支持“MYSQL”这个选项

以及“GD2”和“GetText”这两个选项(为了支持图表正常显示)

 

三、实现思路

2、这个代码不包括评论框及验证码提交按钮等。

2.5         安装mantis的库

完成以上的配置后在浏览器地址栏输入“

 

澳门新浦京8455com 5

图五

选择MySQL数据库,输入创建MySQL时候的用户名密码。

填写完整后,“Install/Upgrade
Databse”进行安装,自动跳转到下一页,检查是否安装成功。如果都是绿色的“GOOD”说明没有问题。

这时打开浏览器,会看到都是英文的界面。且有红的的字体。需要我们来调整一下配置。

WARNING: You should disable the default
“administrator” account or change its password.

需要修改administrator的密码。

WARNING: Admin directory should be removed.

需要把安装目录删除。

 

首先,删除admin安装目录。“D:/mantis-1.1.2/admin”一般情况,为了以后能够继续使用,可以重命名为_admin,或者直接将其压缩成一个admin.rar

其次,修改mantis的配置文件“config_inc.php”这个文件是在我们刚才安装的过程中根据“config_defaults_inc.php”(默认配置文件)由系统自动生成的,里面只有我们在安装时定义的简单的一些值,如下:

<?php

       $g_hostname = ‘localhost’;

       $g_db_type = ‘mysql’;

       $g_database_name = ‘mantis’;

       $g_db_username = ‘root’;

       $g_db_password = ‘123456’;

?>

 

我们需要将其依次添加以下几行

# — 修改默认设置为简体中文 ————-

  $g_default_language =”chinese_simplified”;#
默认语言为简体中文

  $g_allow_signup                 =
ON;#是否允许新用户注册,ON是允许,OFF不允许

# — 登录设置————-

  $g_max_failed_login_count = 5;

  $g_show_realname = ON;#
是否允许匿名登录,ON是允许,OFF不允许

  $g_allow_anonymous_login  = ON;

  $g_anonymous_account              =
‘anonymous’;

 
点击页面扫码按钮,向php发送一个请求,php生成二维码并把sign验证字符串保存至memcache中,请求成功后,页面展示二维码等待扫码,并使用ajax以轮询的方式请求后台方法,查询是否已扫码。手机扫码后访问二维码里面的url链接,php保存已扫码标识,并向ajax返回已扫码状态,前台页面提示已扫码,并再次发送是否已确认登录的ajax轮询。扫码完成后,APP端显示是否登录页面,点击确认,向后台方法传递用户名及sign验证字符串,后台验证通过后,返回用户名,sign及状态码至前端ajax。

这个代码只是替换掉了官方评论中的 登录框一条。

# — 邮件设置

  $g_administrator_email  =
“mantis@****.com”;#

  $g_webmaster_email      =
“mantis@****.com”;# 管理员邮件帐号

  $g_from_email           =
“mantis@****.com”;# 发送者帐号,即Mantis自动发邮件是显示的用户帐号

  $g_return_path_email    =
“mantis@****.com”;# 邮件回复地址

 

  $g_enable_email_notification    = ON;      #
开通邮件通知

  $g_smtp_host     = “mail.****.com”;     #
SMTP 服务器

  $g_smtp_username = “username”;     #
邮箱登录用户名

  $g_smtp_password = “password”;  #
邮箱登录密码

  $g_use_phpMailer = ON;    # 使用 PHPMailer 发送邮件

  $g_phpMailer_path =
“D:/mantis-1.1.2/core/phpmailer”; # PHPMailer 的存放路径

  $g_phpMailer_method   = 2;       # PHPMailer
以 SMTP 方式发送
Email 

 
由于需求是不多改动edusoho自身代码,所以登录时借用edusoho本身的登录,即把ajax返回的用户名填写进用户名框,sign填进密码框,触发登录的submit按钮,只在登录的密码验证处添加了几行代码,把密码验证,改为了sign验证。(symfony2采用的登录方式是security配置化登录,后面会讲到在哪里改动密码验证,不熟悉的可以参考
security安全登录)

另外,有个不完美的地方,就是未登录状态时,点登录后,无法返回登录前页面。导致登录成功后,需要刷新该页面。

# — 其他设置

  $g_show_project_menu_bar = ON;#
是否显示项目选择栏,ON是显示,OFF不显示

  $g_show_queries_count     = ON; #
在页脚是否显示执行的查询次数,ON是显示,OFF不显示

  $g_default_new_account_access_level =
DEVELOPER; # 默认用户级别

  $g_view_summary_threshold   = VIEWER;
#设置查看权限

  $g_window_title =
“****缺陷跟踪管理系统”; #
浏览器标题

  $g_page_title =
“****缺陷跟踪管理系统”; #
页面标题栏

  $g_max_failed_login_count =
5;#默认登录失败次数

  $g_show_realname = ON;#显示真名

  $g_allow_anonymous_login  = ON;#
允许用户匿名登录

  $g_anonymous_account              =
‘anonymous’;#匿名登录的用户名

四、实现代码及步骤

点击下载插件

# — 日期设置

  $g_short_date_format = “Y-m-d”; #
短日期格式,Y 大写表示 4 位年

  $g_normal_date_format =”Y-m-d H:i”; #
普通日期格式

  $g_complete_date_format =”Y-m-d H:i:s”; #
完整日期格式

1、生成登录二维码

# — 报表设置

  $g_use_jpgraph = ON;

  $g_jpgraph_path =
“D:/mantis-1.1.2/core/jpgraph-2.3.3/src/”;  #设置jpgraph的路径

  $g_graph_font = ‘chinese_gbk’; 

 

最后,使用administrator密码root登录,并进入“个人账号”修改administrator的密码、邮箱、名称、真名等等相关项。

小贴士:

如果是在windows下装,要特别注意,文件路径的“/”,不能使用“/”,这在php配置文件中是注释的含义。

 

(1)先在custom下的routing.yml配置访问路由(其他方式路由请自行参考配置,以下方法的路由配置不再赘述)

2.6         配置Mantis

修改配置文件的格式

应注意到,在配置文件中设置的浏览器标题和页面标题栏都是乱码,怎么办呢?

使用UltraEdit打开config_inc.php配置文件,“文件→转换→ASCII转UTF-8”,保存并退出。再次刷新登录页面,一切显示正常。

修改时间

mantis的初始时间是格林威治时间,需要修改为本地“中国”RPC时间。

修改C:/PHP/php.ini文件,搜索“timezone”按照下面的修改。

[Date]

; Defines the default timezone used by the date
functions

date.timezone =PRC

去掉date前面的“;”分号,并在等号后面添加“RPC”,保存并退出。

这个修改需要重新启动IIS才能实现配置生效。“控制面板→管理工具→服务”中的“IIS admin”右键“重新启动”

添加匿名用户

如果想要匿名登录,要添加一个匿名用户的帐号,名称和config_inc.php中配置的相同。

  $g_anonymous_account              =
‘anonymous’;#匿名登录的用户名

注:一般匿名帐号的权限设置为查看人员即可,不要太高。

 

发送邮件失败?

报错SYSTEM WARNING: fsockopen()
[function.fsockopen]: unable to connect to mail.****.com:25
(ӉӚĿ?껺Ʒ???????ӡ?)

这个问题查了好久,最终发现是使用的杀毒软件给控制住了,卡巴斯基没有这个情况,但用McAfee的童鞋就要小心了,请在McAfee中如图六所示配置

 

澳门新浦京8455com 6

图六

 

澳门新浦京8455com 7

2.7         配置统计报表“jpgraph”

首先确认mantis的config_inc.php文件中是否已经配置好了关于jpgraph的三项。

其次解压缩jpgraph2.3.3.rar到mantis的core文件夹下,D:/mantis-1.1.2/core/jpgraph-2.3.3

修改D:/mantis-1.1.2/core/graph_api.php,

搜索graph_get_font,添加’chinese_gbk’ => FF_SIMSUN,

function graph_get_font() {

$t_font_map = array(

‘arial’ => FF_ARIAL,

‘verdana’ => FF_VERDANA,

‘courier’ => FF_COURIER,

‘comic’ => FF_COMIC,

‘times’ => FF_TIMES,

‘georgia’ => FF_GEORGIA,

‘trebuche’ => FF_TREBUCHE,

‘vera’ => FF_VERA,

‘veramono’ => FF_VERAMONO,

‘chinese_gbk’ => FF_SIMSUN,

‘veraserif’ => FF_VERASERIF );

保存并关闭

 

最后将D:/mantis-1.1.2/core/jpgraph-2.3.3/src/jpgraph_ttf.inc.php这个文件中的99-106行注释掉。如下所示:

/*     elseif( $aFF ===
FF_SIMSUN ) {

           // Do Chinese conversion

           if( $this->g2312 == null ) {

              include_once ‘jpgraph_gb2312.php’
;

              $this->g2312 = new
GB2312toUTF8();

           }

           return
$this->g2312->gb2utf8($aTxt);

       }*/

小贴士:

这段代码的含义就是做中文转换,但jpgraph在这里再次做转换显然是多此一举,所以,注释掉就OK啦

 

(2)点击扫码按钮的js代码(可以把key存进cookie中,本示例直接写进了页面的隐藏域)

2.8         其他说明

另外我想指出的是关于“路线图和变更说明”这两个新的功能

我在linux下曾经看到过变更说明,但是路线图就从来没有出现过。

在windows下这两个功能彻底不出来了,不过,也不报错,只是空白,很郁闷。我怀疑是查询数据库之后返回的结果为空,可能是数据库结构的问题,要不就是数据的问题,比较有关系的就是一个叫做mantis_bug_history_table的表,但我也没有仔细查找。

 

   //点击扫码弹出框
    $('.scanqrcode').click(function (){
        $('.login-section').hide();//隐藏登陆框
        $('.qrcode').show();//弹窗
        $('.timeout').hide();
        $('.barcode-container.scanned .status.scanned, .barcode-container.scanned .mask').hide();
        $('.login_op').show();//显示遮罩层
        //请求二维码
        $.ajax({
            type: "POST",
            dataType: "json",
            url: "/login/create/qrcode",
            success: function (data) {
                if(data.status==1){
                    var qrcodeimg = '../../assets/img/qrcodeimg/'+data.msg+'.png';
                    //把key放进隐藏域
                    $('#key').val(data.msg);
                    //替换二维码
                    $('.qrcode-img').attr('src',qrcodeimg);
                    //触发定时任务,查看是否已扫码
                    var inter = setInterval("is_sacn_qrcode();",3000);
                    $('#timing').val(inter);
                }
            }
        });
    });

3         参考文档

BugZilla之外的选择——另一个 Bug
跟踪管理系统 Mantis 在 IIS5 下安装指南

mantis统计报表和图形报表出现乱码问题的解决方法(原创)

 

大功告成啊~~~~休息一下下

版权声明:本文为博主原创文章,未经博主允许不得转载。


(3)写createQrcode方法生成二维码图片的php代码(doString方法是生成sign字符串的算法,还请自行发明创造,生成结果每次都不一样是最好的)

    //生成登录二维码
    public function CreateQrcodeAction(){
        ob_start();
        $url = 'http://'.$_SERVER['HTTP_HOST'];//获取当前的url
        $http = $url.'/login/mobile/scan/qrcode';//确认扫码的url方法
        $key = $this->getRandom(30);//存放在memcache中的键值,随机32位字符串
        $_SESSION['qrcode_name'] = $key;//把key当做图片的名字存在session里
        $sgin_data = $this->doString();//生成sign字符串的基本算法
        $sgin = strrev(substr($key,0,2)) . $sgin_data;//截取前两位并反转
        $value = $http.'?key='.$key.'&type=1';//二维码内容
        $errorCorrectionLevel = 'H';//容错级别
        $matrixPointSize = 8;//生成图片大小
        //生成二维码图片
        QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 0);
        $logo =     "assets/img/qrcodeimg_logo.png";//准备好的logo图片
        $QR = 'qrcode.png';//已经生成的原始二维码图
        if ($logo !== FALSE) {
            $QR = imagecreatefromstring(file_get_contents($QR));
            $logo = imagecreatefromstring(file_get_contents($logo));
            $QR_width = imagesx($QR);//二维码图片宽度
            $QR_height = imagesy($QR);//二维码图片高度
            $logo_width = imagesx($logo);//logo图片宽度
            $logo_height = imagesy($logo);//logo图片高度
            $logo_qr_width = $QR_width / 3;
            $scale = $logo_width/$logo_qr_width;
            $logo_qr_height = $logo_height/$scale;
            $from_width = ($QR_width - $logo_qr_width) / 2;
            //重新组合图片并调整大小
            imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,
                $logo_qr_height, $logo_width, $logo_height);
        }
        //输出图片
        $img = imagepng($QR, 'assets/img/qrcodeimg/'.$key.'.png');
        $return = array('status'=>0,'msg'=>'');
        if($img){
            $mem = new Memcache();
            $mem->connect('127.0.0.1',11211);
            $res = json_encode(array('sign'=>$sgin,'type'=>0));
            //存进memcache,过期时间三分钟
            $mem->set($key,$res,0,180);//180
            $return = array('status'=>1,'msg'=>$key);
        }
        return $this->createJsonResponse($return);
    }

2、jquery弹出页面二维码并启动ajax轮询查询是否扫码

(1)显示效果图:

澳门新浦京8455com 8

(2)请求是否扫码的js代码(未扫码就一直轮询,已扫码关闭“查看是否已扫码”方法,开启“查看是否确认登录”的方法轮询,关闭二维码框清除所有方法)

//查看是否已扫码
function is_sacn_qrcode (){
    $.ajax({
        type: "POST",
        dataType: "json",
        url: " /login/scan/qrcode",
        success: function (data) {
            if(data.status==1){
                //扫码成功
                $('.barcode-container.scanned .status.scanned, .barcode-container.scanned .mask').show();
                //取消定时任务,清除cookie
                clearInterval($('#timing').val());
                $('#timing').val('');
                ////定时2秒关闭弹窗
                //setTimeout(function(){
                //    $('.qrcode').hide();
                //},2000);

                //查看是否已确认登录
                var is_login = setInterval("is_login();",3000);
                $('#is_login').val(is_login);
                //$.cookie('is_login', is_login);

            }else if(data.status==2){
                $('.timeout,.mask').show();
                //取消定时任务,清除cookie
                clearInterval($('#timing').val());
                $('#timing').val('');
            }
        }
    });
}

(3)查看是否已扫码的php代码

    /**
     * 查看是否已扫码
     */
    public function isScanQrcodeAction(){

        $key = $_SESSION['qrcode_name'];
        $mem = new Memcache();
        $mem->connect('127.0.0.1',11211);
        $data = json_decode($mem->get($key),true);
        if(empty($data)){
            $return = array('status'=>2,'msg'=>'已过期');
        }else{
            if($data['type']){
                $return = array('status'=>1,'msg'=>'成功');

            }else{
                $return = array('status'=>0,'msg'=>'');
            }
        }

        return $this->createJsonResponse($return);
    }

(4)客户端扫码的php代码

    //移动设备扫码
    public function mobileScanQrcodeAction(Request $request,$key){
        $key = $_GET['key'];
        $url = 'http://'.$_SERVER['HTTP_HOST'];
        $agent=$_SERVER["HTTP_USER_AGENT"];
        if (!(strpos($agent, 'MicroMessenger') === false)) {
            // 获取版本号
            //preg_match('/.*?(MicroMessenger/([0-9.]+))s*/', $agent, $matches);
            $app_url = 'http://club.risecenter.com/wap_app.html';
            // 微信浏览器,跳转至下载APP页面(可判断非指定app浏览器都跳转至此页面)
            return $this->redirect($app_url);
        }
        $http = $url.'/login/qrcodedoLogin';//返回确认登录的链接
        $mem = new Memcache();
        $mem->connect('127.0.0.1',11211);
        $data = json_decode($mem->get($key),true);
        $data['type']=1;//增加type值,用来判断是否已扫码
        $res = json_encode($data);
        $mem->set($key,$res,0,180);
        $http = $http.'?key='.$key.'&type=scan';
        $return = array('status'=>1,'msg'=>$http);
        return $this->createJsonResponse($return);
    }

3、扫码成功后判断是否确认登录

(1)扫码成功效果图:

澳门新浦京8455com 9

(2)扫码成功后查询是否登录js代码(客户端确认登录后把用户名传递给ajax,js把用户名和sign填到用户名和密码表单,触发页面隐藏的submit登录按钮)

//查看是否已确认登录
function is_login(){
    var key = $('#key').val();
    $.ajax({
        type: "POST",
        dataType: "json",
        url: "/login/entry/login",
        data:{
            key:key
        },
        success: function (data) {
            if(data.status==1){
                var uid = data.uid;
                var sign = data.sign;
                //取消定时任务,清除cookie
                clearInterval($('#is_login').val());
                $('#is_login').val('');
                //隐藏扫码成功
                $('.barcode-container.scanned .status.scanned, .barcode-container.scanned .mask').hide();
                //弹出已确认
                $('.confirmed,.mask').show();
                //定时1秒确认登陆
                setTimeout(function(){
                    //确认登录
                    $('#login_username').val(data.user);
                    $('#login_password').val(data.sign);
                    $('#login-form').submit();
                },1000);

            }else if(data.status==2){
                //取消定时任务,清除cookie
                clearInterval($('#is_login').val());
                $('#is_login').val('');
                alert(data.msg);
            }
        }
    });
}

(3)查询是否已确认登录的php代码

    /**
     * 客户端扫码后登录
     * $sign  客户端扫码时传递标识,与memcache中的做对比
     * $key   网页端二维码中传递的key
     * $uid   客户端登陆后扫码传递的用户id
     * @return void
     */
    public function qrcodeDoLoginAction(Request $request,$login,$key,$sign){

        $login = $_GET['login'];
        $key = $_GET['key'];
        $sign = $_GET['sign'];
        $mem = new Memcache();
        $mem->connect('127.0.0.1',11211);
        $data = json_decode($mem->get($key),true);//取出memcache的值
        if($data['sign']!=$sign){//验证传递的sign
            $return = array('status'=>0,'msg'=>'验证错误');
            return $this->createJsonResponse($return);
        }else{
            if($login){//手机扫码网页登陆,把用户名存进memcache

                $data['login'] = $login;
                $res = json_encode($data);
                $mem->set($key,$res,0,180);
                $return = array('status'=>1,'msg'=>'登录成功');
                return $this->createJsonResponse($return);
            }else{
                $return = array('status'=>0,'msg'=>'请传递正确的用户信息');
                return $this->createJsonResponse($return);
            }
        }

    }

4、确认登录

 
走到这里,就到了本次扫码登录的最后一步了,也是最关键的一步,不知道诸位看官们把symfony2的security安全登录机制看的怎么样了,原理先不管了,毕竟不在本次的讨论范围之内,直接说改哪好了。

/src/topxia/WebBundle/Handler/AuthenticationProvider.php
的checkAuthentication方法,可以直接改,也可以继承到custom再改。

php代码如下:

澳门新浦京8455com 10

5、二维码过期设置

 
为了安全考虑,设置二维码过期是很关键的一个步骤,在所有的php代码里,存放在memcache中的数据都有一个时间限制,本示例中的时间是3分钟,过期后,memcache会删除掉原有的数据记录,当ajax请求不到数据的时候,要在页面显示二维码已过期,要求重新刷新二维码。

效果图如下:

澳门新浦京8455com 11

结论:

1、php扫码登录只是一个确认的过程,在每次访问接口的时候,安全验证尤为重要,本次方法未涉及到验证的算法,请诸位根据自身项目进行补充调整,先有理念再说嘛。

2、对于ajax轮询的方法是否low,嗯,low。还有更好的实现方式,比如websocket,goeasy等大家见仁见智,不过貌似支付宝和京东的扫码都是轮询,不对请见谅。

3、本次扫码登录只是一个理念,不仅仅针对edusoho平台,所有的都可以移植过去使用,不过,做好安全就好。

4、前端二维码框的html和css代码诸位不会找我要了吧,毕竟你们都是大牛嘛。

5、能看到这里,真的挺感谢,没白写一场,另外,大牛们打击的时候手下留情些,我还有第二版呢,也许比这个好哦。

 

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图