thinkphp 怎么做登录验证
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp 怎么做登录验证相关的知识,希望对你有一定的参考价值。
参考技术A 登录无非就是验证用户名密码以及验证码是否正确,我们可以新建一个CommonAction的公共类,用来校验权限,其他所有类继承此类。该类内部写一个初始化方法,用于验证,这一讲先不详细讲解。继续说登录,由于登录是公开模块的方法,所以可以新建一个PublicAction类,用于公共的免验证方法,同时在配置文件中添加'NOT_AUTH_MODULE'=>'Public',//默认不需要认证的模块
'USER_AUTH_GATEWAY'=>'/Public/login',//默认的认证网关
然后开始编写Public类,具体代码如下:
<?php
classPublicActionextendsCommonAction
//验证码显示
publicfunction verify()
import("ORG.Util.Image");
Image::buildImageVerify(4,1,"png",100,28,"verify");
//验证是否账号密码
function checklogin()
//此处多余可自行改为Model自动验证
if(empty($_POST['username']))
$this->error('帐号错误!');
elseif (empty($_POST['password']))
$this->error('密码必须!');
elseif (empty($_POST['verify']))
$this->error('验证码必须!');
$map=array();
$map['username']=$_POST['username'];
$map['status']=array('gt',0);
if($_SESSION['verify']!= md5($_POST['verify']))
$this->error('验证码错误!');
import('ORG.Util.RBAC');
//C('USER_AUTH_MODEL','User');
//验证账号密码
$authInfo=RBAC::authenticate($map);
if(empty($authInfo))
$this->error('账号不存在或者被禁用!');
else
if($authInfo['password']!=md5($_POST['password']))
$this->error('账号密码错误!');
else
$_SESSION[C('USER_AUTH_KEY')]=$authInfo['id'];//记录认证标记,必须有。其他信息根据情况取用。
$_SESSION['email']=$authInfo['email'];
$_SESSION['nickname']=$authInfo['nickname'];
$_SESSION['user']=$authInfo['username'];
$_SESSION['last_login_date']=$authInfo['last_login_date'];
$_SESSION['last_login_ip']=$authInfo['last_login_ip'];
//判断是否为超级管理员
if($authInfo['username']=='admin')
$_SESSION[C('ADMIN_AUTH_KEY')]=true;
//以下操作为记录本次登录信息
$user=M('User');
$lastdate=date('Y-m-d H:i:s');
$data=array();
$data['id']=$authInfo['id'];
$data['last_login_date']=$lastdate;
$data['last_login_ip']=$_SERVER["REMOTE_ADDR"];
$user->save($data);
RBAC::saveAccessList();//用于检测用户权限的方法,并保存到Session中
$this->assign('jumpUrl',.'/Index/index');
$this->success('登录成功!');
//退出登录操作
function logout()
if(!empty($_SESSION[C('USER_AUTH_KEY')]))
unset($_SESSION[C('USER_AUTH_KEY')]);
$_SESSION=array();
session_destroy();
$this->assign('jumpUrl',/Code.'/login');
$this->success('登出成功');
else
$this->error('已经登出了');
以上代码仅实现功能,没有做优化,有些验证的操作可以放到model,session也不用一 一赋值,用数组即可,我想已经入门的应该可以自己改的更好。
php thinkphp3.2怎么做会员登录
现在很多网站都有 QQ互联 和新浪微博 一键登录功能,国内很多php开源项目的代码都是使用thinkphp框架编写的,但是thinkphp框架如何添加QQ互联 和新浪微博 一键登录功能呢?工具/原料
Thinkphp3.2版本源码
QQ互联 和新浪微博 申请到的 APPID和APPKEY。
方法/步骤
一:到腾讯QQ互联上申请APPID和APPKEY。申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY。新浪微博的申请同理
二:在Thinkphp官网下载 Thinkphp3.2版本的框架源码
本地安装好Thinkphp后,找到应用下的,Common/conf/config.php文件里加上。QQ互联对应的APPID和APPKEY等QQ_AUTH配置信息:
\'QQ_AUTH\' => array(
\'APP_ID\' => \'1XDXXXXX\', //你的QQ互联APPID
\'APP_KEY\' => \'2XXXXXXXXXXXXXXXXXXXXX\',
\'SCOPE\' => \'get_user_info,get_repost_list,add_idol,add_t,del_t,add_pic_t,del_idol\',
\'CALLBACK\' => \'http://www.baidu.com/user/oauth/callback/type/qq.html\',
),
//新浪微博的配置同理一样。
在Common目录下建立一个文件夹api。创建文件QQConnect.class.php ,添加如下代码,这里是 我们写好的一个类:
<?php
namespace Common\\Api;
class QQConnect
/**
* 获取QQconnect Login 跳转到的地址值
* @return array 返回包含code state
*
**/
public function login($app_id, $callback, $scope)
$_SESSION[\'state\'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
.$app_id. "&redirect_uri=" . urlencode($callback)
. "&state=" . $_SESSION[\'state\']
. "&scope=".urlencode($scope);
//显示出登录地址
header(\'Location:\'.$login_url);
/**
* 获取access_token值
* @return array 返回包含access_token,过期时间的数组
* */
private function get_token($app_id,$app_key,$code,$callback,$state)
if($state !== $_SESSION[\'state\'])
return false;
exit();
$url = "https://graph.qq.com/oauth2.0/token";
$param = array(
"grant_type" => "authorization_code",
"client_id" => $app_id,
"client_secret" => $app_key,
"code" => $code,
"state" => $state,
"redirect_uri" => $callback
);
$response = $this->get_url($url, $param);
if($response == false)
return false;
$params = array();
parse_str($response, $params);
return $params["access_token"];
/**
* 获取client_id 和 openid
* @param $access_token access_token验证码
* @return array 返回包含 openid的数组
* */
private function get_openid($access_token)
$url = "https://graph.qq.com/oauth2.0/me";
$param = array(
"access_token" => $access_token
);
$response = $this->get_url($url, $param);
if($response == false)
return false;
if (strpos($response, "callback") !== false)
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
$user = json_decode($response);
if (isset($user->error) || $user->openid == "")
return false;
return $user->openid;
/**
* 获取用户信息
* @param $client_id
* @param $access_token
* @param $openid
* @return array 用户的信息数组
* */
public function get_user_info($app_id,$token,$openid)
$url = \'https://graph.qq.com/user/get_user_info?oauth_consumer_key=\'.$app_id.\'&access_token=\'.$token.\'&openid=\'.$openid.\'&format=json\';
$str = $this->get_url($url);
if($str == false)
return false;
$arr = json_decode($str,true);
return $arr;
/**
* 请求URL地址,返回callback得到返回字符串
* @param $url qq提供的api接口地址
* */
public function callback($app_id, $app_key, $callback)
$code = $_GET[\'code\'];
$state = $_GET[\'state\'];
$token = $this->get_token($app_id,$app_key,$code,$callback,$state);
$openid = $this->get_openid($token);
if(!$token || !$openid)
return false;
exit();
return array(\'openid\' => $openid, \'token\' => $token);
/*
* HTTP GET Request
*/
private function get_url($url, $param = null)
if($param != null)
$query = http_build_query($param);
$url = $url . \'?\' . $query;
$ch = curl_init();
if(stripos($url, "https://") !== false)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200)
return $content;
else
echo $status["http_code"];
return false;
/*
* HTTP POST Request
*/
private function post_url($url, $params)
$ch = curl_init();
if(stripos($url, "https://") !== false)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200)
return $content;
else
return false;
在项目下创建一个User模板,然后再创建一个OauthConnect.class.php文件,用户调用 QQConnect.class.php。
OauthConnect.class.php里面加入如下,
<?php
namespace User\\Controller;
use Think\\Controller;
class OauthController extends Controller
/*
* Type类型,初始化
* QQConnet WeiboConnect
*/
public function index()
switch ($_GET[\'type\'])
/* QQ互联登录 */
case qq:
$app_id = C(\'QQ_AUTH.APP_ID\');
$scope = C(\'QQ_AUTH.SCOPE\');
$callback = C(\'QQ_AUTH.CALLBACK\');
$sns = new \\Common\\Api\\QQConnect; 参考技术A 前台post数据
后端配好数据库
对接收过来的用户密码与数据库的数据相匹配,正确则登录 参考技术B 加一个控制器 验证登陆信息 然后跳转不就可以了么
以上是关于thinkphp 怎么做登录验证的主要内容,如果未能解决你的问题,请参考以下文章