今天晚上把ThinkPHP的權限分配弄明白了,內心的包袱馬上放下了,感受那個爽啊!稍微記錄一下。php
背景:CMS系統開發(17do)。html
項目分組:Admin(後臺管理)、Home(前臺顯示)。
Admin組中包含ManagerAction、UserActin、ArticleAction三個控制器node
第一部分:表關係對應(箭頭是指數據來源)數據庫
定義結果:站長1能訪問項目用戶和文章的全部操做,管理員3只能對文章模塊操做不能訪問用戶模塊。session
第二部分:項目配置
項目的config.php文件中添加函數
//權限分配設置
'USER_AUTH_ON'=>true, //是否須要認證
'USER_AUTH_TYPE'=>1, //認證類型
'USER_AUTH_KEY'=>'userId', // 認證識別號
'USER_AUTH_MODEL'=>'user',//模型實例(用戶表名)
'REQUIRE_AUTH_MODULE'=>'User', //須要認證模塊
'NOT_AUTH_MODULE'=>'', //無需認證模塊
'USER_AUTH_GATEWAY'=>'/Public/login', //認證網關
//RBAC_DB_DSN 數據庫鏈接DSN
'RBAC_ROLE_TABLE'=>'do_role', //角色表名稱
'RBAC_USER_TABLE'=>'do_role_user', //用戶和角色對應關係表名稱
'RBAC_ACCESS_TABLE'=>'do_access', //權限分配表名稱
'RBAC_NODE_TABLE'=>'do_node', // 權限表名稱post
第三部分:權限信息寫入控制器this
public function checkUser(){
//表單數據不能爲空
if($this->_post('username')&&$this->_post('password')&&$this->_post('verifycode')){
$pwd= $this->_post('password');
$username= $this->_post('username');
//驗證碼是否正確
$verify= $this->_post('verifycode');
if($this->_session('verify')!= md5($verify)){
$this->error("驗證碼錯誤");
}else{
//建立數據庫對象
$user=M('user');
//根據用戶名查詢
$cond['username']=$username;
$cond['active']=array('gt',0);
//加載RBAC類
import('ORG.Util.RBAC');
//經過authenticate讀取用戶信息
$result=RBAC::authenticate($cond);
//dump($result);
if($result){
if($result['password']==md5($pwd)){
$_SESSION[C('USER_AUTH_KEY')]=$result['id'];
$_SESSION["name"]=$result['name'];
//使用saveAccessList緩存訪問權限
RBAC::saveAccessList();
$this->display('Manager:index');
}else{
$this->error("用戶密碼錯誤");
}
}else{
$this->error("用戶名不存在或已經被禁用");
}url
}
第四部分:建立驗證權限控制器
class CommonAction extends Action{
//_initialize()方法是ThinkPHP提供的入口方法,相似於原PHP中__condition()構造函數。能夠存放全部公用信息。
function _initialize(){
//判斷是否開啓認證,而且當前模塊須要驗證
if(C('USER_AUTH_ON')&&!in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))){
//導入RBAC類,開始驗證
import('ORG.Util.RBAC');
//經過accessDecision獲取權限信息
if(!RBAC::AccessDecision()){
//沒有獲取到權限信息時須要執行的代碼
//一、用戶沒有登陸
if(!$_SESSION[C('USER_AUTH_KEY')]){
$url= U('Public/login');
$this->error("您尚未登陸不能訪問",$url);
}
$this->error("您沒有操做權限");
}
}
}
}
第五部分:驗證控制器調用
只要須要權限驗證的控制器繼承CommonAction就能夠啦!
使用admin帳號登錄能正常訪問