ThinkPHP之RBAC詳解如何實現登入驗證?

Tags: 驗證碼,

這次通過實際程式碼來分析。首先講登入部分,登入無非就是驗證使用者名稱密碼以及驗證碼是否正確,我們可以新建一個CommonAction的公共類,用來校驗許可權,其他所有類繼承此類。該類內部寫一個初始化方法,用於驗證,這一講先不詳細講解。繼續說登入,由於登入是公開模組的方法,所以可以新建一個PublicAction類,用於公共的免驗證方法,同時在配置檔案中新增

'NOT_AUTH_MODULE'=>'Public',//預設不需要認證的模組

'USER_AUTH_GATEWAY'=>'/Public/login',//預設的認證閘道器

然後開始編寫Public類,具體程式碼如下:

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也不用一 一賦值,用陣列即可,我想已經入門的應該可以自己改的更好。

相關問題答案