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 怎么做登录验证的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP登陆注册

ThinkPhp框架:父类及表单验证

Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册

Thinkphp6中间件引起验证码不显示?

登陆注册

ThinkPHP之登录验证