ThinkPHP學習筆記(十九)許可權管理的實現方式RBAC
Action的方法
下面上一下五張表的資料
tb_user:使用者表
Role許可權組表
role_user:許可權組與使用者的對應關係表
node表:表示當前項目中url分類,精確到每個方法的控制
access表:表示不同使用者組對應的可以訪問的不同url分類
config中需要設定的參數:
//設定rbac的參數'USER_AUTH_ON'=>true,'USER_AUTH_TYPE'=>1,// 預設認證類型 1 登入認證 2 即使認證'USER_AUTH_KEY'=>'authId',// 使用者認證SESSION標記 'ADMIN_AUTH_KEY'=>'administrator',//管理員標識'USER_AUTH_MODEL'=>'User',// 預設驗證資料表模型'AUTH_PWD_ENCODER'=>'md5',// 使用者認證密碼加密方式'USER_AUTH_GATEWAY'=>'/Public/login',// 預設認證網關'NOT_AUTH_MODULE'=>'Public',// 預設無需認證模組'REQUIRE_AUTH_MODULE'=>'',// 預設需要認證模組'NOT_AUTH_ACTION'=>'',// 預設無需認證操作'REQUIRE_AUTH_ACTION'=>'',// 預設需要認證操作 'GUEST_AUTH_ON' => false, // 是否開啟遊客授權訪問 'GUEST_AUTH_ID' => 0, // 遊客的使用者ID(可以在資料庫組中設定一個id為0的遊客組)'SHOW_RUN_TIME'=>true,// 已耗用時間顯示'SHOW_ADV_TIME'=>true,// 顯示詳細的已耗用時間'SHOW_DB_TIMES'=>true,// 顯示資料庫查詢和寫入次數'SHOW_CACHE_TIMES'=>true,// 顯示快取作業次數'SHOW_USE_MEM'=>true,// 顯示記憶體開銷 'DB_LIKE_FIELDS'=>'title|remark','RBAC_ROLE_TABLE'=>'think_role','RBAC_USER_TABLE'=>'think_role_user','RBAC_ACCESS_TABLE' =>'think_access','RBAC_NODE_TABLE'=> 'think_node',
PublicAction中需要設定的公用存取方法;(命名基於配置中的NOT_AUTH_MODULE的配置)
login(); } public function login(){ $this->display(); } //可以去例子中複製 public function checkLogin(){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' ); $authInfo = RBAC::authenticate($map); //使用使用者名稱、密碼和狀態的方式進行認證 if(false === $authInfo) { $this->error('帳號不存在或已禁用!'); }else { if($authInfo['password'] != md5($_POST['password'])) { $this->error('密碼錯誤!'); } $_SESSION[C('USER_AUTH_KEY')]=$authInfo['id'];// $_SESSION['email']=$authInfo['email'];// $_SESSION['loginUserName']=$authInfo['nickname'];// $_SESSION['lastLoginTime']=$authInfo['last_login_time'];//$_SESSION['login_count']=$authInfo['login_count']; if($authInfo['username']=='admin') { $_SESSION['administrator']=true; } //儲存登入資訊//$User=M('User');//$ip=get_client_ip();//$time=time();// $data = array();//$data['id']=$authInfo['id'];//$data['last_login_time']=$time;//$data['login_count']=array('exp','login_count+1');//$data['last_login_ip']=$ip;//$User->save($data);// 緩衝存取權限 RBAC::saveAccessList();$this->success('登入成功!');} } //可以去例子中複製 public function loginout(){ if(isset($_SESSION[C('USER_AUTH_KEY')])) {unset($_SESSION[C('USER_AUTH_KEY')]);unset($_SESSION);session_destroy(); $this->assign("jumpUrl",__URL__.'/login/'); $this->success('登出成功!'); }else { $this->error('已經登出!'); } }}?>
CommonAction中設定所有url的過濾方法
assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );}// 提示錯誤資訊$this->error ( L ( '_VALID_ACCESS_' ) );}}}}public function verify(){//匯入驗證碼類//方式一:import('ORG.Util.Image');//方式二:@代表當前項目的lib檔案夾(需要自己複製或者自己寫一個新的類)//import('@.ORG.Image')//Image::buildImageVerify();//擴充修改 /** * @param string $length 位元 * @param string $mode 類型(0字母,1數字,2大寫字母,3小寫字母,4中文,5混合) * @param string $type 映像格式 * @param string $width 寬度 * @param string $height 高度 * buildImageVerify($length=4,$mode=1,$type='png',$width=48,$height=22,$verifyName='verify') */Image::buildImageVerify(5,5,'png',80,22);//中文驗證碼(2.0會有一個問題:msubstr有錯誤)//1.修改function::msubstr//2.加入字型ttf需要放入image同級目錄之下//擴充可以去類檔案中查看//Image::GBVerify();}}?>
Public檔案夾下的login。html
Insert title here