2014-10-12 39 views
0

決定功能是私密還是公開的標準是什麼或什麼是標準。決定功能在CI中應該是私密還是公開的方式/標準

我總是編碼沒有聲明的功能,所以它被視爲公共,但它工作正常。不過,我在指南上看到這個,

在某些情況下,您可能希望某些功能隱藏公開訪問。要使某個功能成爲專用,只需添加一個下劃線作爲名稱前綴,並且不會通過URL請求提供。例如,如果你有這樣的功能:

控制器中的公共訪問功能如何?

我在每一個控制器上都有這行代碼。

if (! defined('BASEPATH')) exit('No direct script access allowed'); 

這可以防止用戶直接通過控制器並通過url權限訪問功能?

我試過了,儘管我把這行代碼用於查看頁面,如果有人試圖直接訪問視圖,他們會被髮送出去。

一個私有函數獲取一個錯誤,而我可以訪問函數聲明/假定爲公共。

什麼是功能的標準是'必須'私人。像訪問數據庫的功能?或有價值的數據?像來自用戶的輸入信息(敏感信息,如賬戶詳情/用戶名 - 密碼)?

或者我應該只保留一切私人,所以用戶不能直接訪問功能?

實施例:

我已命名爲 '主'

public function index(){ 
    if($this->input->cookie('cookie',TRUE)){ 

    } 
    else 
    $this->load->view('login'); 
} 

檢查是否存在的cookie(如果用戶已登錄的話)缺省控制器。如果我將索引函數設置爲私有,每當我訪問根目錄/主文件夾時,它都無法訪問。所以我把它設置爲公開的。我的推理合乎邏輯/合理嗎?

public function login(){ 
$this->form_validation->set_rules('username', 'Username', 'required|callback_check_account'); 
$this->form_validation->set_rules('password', 'Password', 'required'); 

if($this->form_validation->run() == FALSE){ 
$this->load->view('login'); //i tried using redirect, but it does not pass the error message for validation 
}else{ 

} 
} 

我宣佈登錄功能爲public。由於需要的數據通過登錄表單提交,因此它在調用時不能從回調函數訪問。

public function check_account($username){ 
    $data = array('username' => $username, 'password' => $_POST['password']); 
    $result = $this->LoginModel->validate_account($data); 
    if(empty($result)){ 
    $this->form_validation->set_message('check_account' , 'account does not exist'); 
    $this->form_validation->set_message('required' , ''); 
    return FALSE; 
    } else if($result == 'invalid'){ 
    $this->form_validation->set_message('check_account' , 'password does not match'); 
    $this->form_validation->set_message('required' , ''); 
    return FALSE; 
    } else if($result){ 
     $isLoggedin = array('username' => $result['username'] , 'type' => $result['status'] , 'is_loggedin' => TRUE); 
     $this->session->set_userdata($isLoggedin); 
    return TRUE; } 
    } 

我聲明它是公開的,因爲如果我聲明它是私有的,我的回調會導致致命錯誤。用戶可以通過鏈接訪問此/Main/check_account/username

型號:

function validate_account($data){ 
     $this->db->select('username,password')->where('username' , $data['username']); 
     $query = $this->db->get('admin')->result_array(); 
     if(!empty($query)){ 
      foreach($query as $row){ 
       if($data['password'] != $row['password']){ 
       return 'invalid'; } 
       else $query = array('username' => $row['username'] , 'password' => $row['password'] , 'status' => 'administrator'); 
return $query; } 
     } else { 
     $this->db->select('username,password')->where('username' , $data['username']); 
     $query = $this->db->get('user_mst')->result_array(); 
     if(!empty($query)){ 
      foreach($query as $row){ 
       if($data['password'] != $row['password']){ 
       return 'invalid'; } 
       else $query['status'] = 'user'; return $query; } 
     } } 
     } 

編輯:改變了回調函數,以檢查是否

「帳戶不存在」

不顯示輸入的用戶名是否存在

,如果返回無效,則顯示

「密碼不匹配」

如果返回$查詢,我設置會話,加上帳戶狀態,因爲即時通訊創造只有1兩個管理員和用戶登錄。我仍然不知道我怎麼會在我的會話中使用

「型」

,但我只是把它放在那裏櫃面生病需要檢查會話,如果用戶是管理員或用戶,因此他們不能訪問彼此的頁面。

回答

0

如果你不想check_account作爲控制器的動作,你應該使用

public function _check_account($value) { ... } 

,並調用這樣的回調:

$this->form_validation->set_rules('username', 'Username', 'required|callback__check_account'); 

注意,有兩個下劃線「_ ''回調'和'檢查'之間。此外,提交的表單字段的值將是您回調的參數。

+0

它帶來了什麼區別? 我也編輯了我的問題,更新了我的代碼。 – 2014-10-13 08:40:30

+0

在CodeIgniter中,公共函數以Controller中的下劃線開頭,並不會公開爲網頁的動作,即/ Main/_check_account/username不會調用您的公共方法_check_account($ value)。這允許你爲不能通過HTTP訪問的驗證器編寫回調函數。你需要使回調「公開」(對於表單驗證器),但是保護HTTP訪問,比如CodeIgniter設計中的「private」。 – 2014-10-13 08:53:04

+0

嗯,我明白,順便說一下,你可以檢查爲什麼我的會話用戶數據'用戶名'只打印爲'a',當我輸入時,print_r($ this-> session-> all_userdata()); – 2014-10-13 08:59:58

相關問題