ThinkPHP之RBAC詳解如何實現登入驗證?
這次通過實際程式碼來分析。首先講登入部分,登入無非就是驗證使用者名稱密碼以及驗證碼是否正確,我們可以新建一個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也不用一 一賦值,用陣列即可,我想已經入門的應該可以自己改的更好。