2011-09-02 174 views
0

我必須做一個cakePhp驗證,並且我希望使用「身份驗證」組件。我想看看它填補我的要求:CakePhp身份驗證:問題

  • 我需要與他們的電子郵件或他們的客戶ID,(當然的加成密碼)來驗證用戶身份。我無法找到是否有兩個字段(或更多)的身份驗證可以完成

  • 我有幾個部分,我需要進行身份驗證。但我需要型動物粒度:

    • 對於一些事情,這是整個控制器,它不應該訪問的(如果可能的話,出現異常(例如,所有的「用戶」控制,除登錄/註冊動作),其他我真的需要它是整個控制器(例如購物車控制器)
    • 有時我需要只有某些操作不可用而不記錄
    • 有時我需要只顯示一部分視圖(例如,登錄元素不顯示)
  • 組件ma nage動作像密碼更改?因爲如果用戶更改密碼,我需要他沒有斷開連接。

非常感謝您的幫助

回答

2

簡短的回答是,是的,你可以做這些事情,但在我看來,該ACL可能是矯枉過正滿足您的需要(但我也傾向於避免ACL如果有任何根本打開這樣做)。爲了你的觀點:

  • 由於伊沃建議,你需要一個定製UsersController::login()方法,通過多個領域進行身份驗證(如果您的身份驗證模式不User,然後使用適當的控制器)。如果Auth組件的登錄方法失敗,它會將控制權傳遞給您的自定義方法login()。下面是一個項目,我一直工作在一個片段:

    function login() { 
        # Allow login by either username (legacy) or email. 
        # If no authenticated user exists at this point then the Auth 
        # component's login() method has failed and control has been passed 
        # here for any further handling. Since the expected credentials 
        # (email and password) have failed we're going to check for 
        # username and password. 
        $user = $this->Auth->user(); 
        if(empty($user) && !empty($this->Auth->data['User']['email']) && !empty($this->Auth->data['User']['password'])) { 
        $user = $this->User->find(
         'first', 
         array(
         'recursive' => -1, 
         'conditions' => array(
          'User.username' => $this->Auth->data['User']['email'], 
          'User.password' => $this->Auth->data['User']['password'], 
         ) 
        ) 
        ); 
    
        if(empty($user) || !$this->Auth->login($user)) { 
         # Set the configured flash message b/c login failed after both checks. 
         $this->Session->setFlash($this->Auth->loginError, null, array(), 'auth'); 
        } 
        } 
    
        $this->redirect($this->Auth->redirect(), null, true); 
    } 
    
  • 對於行動上網,只需使用$this->Auth->allow()$this->Auth->deny()方法在每個相關控制器的beforeFilter()回調。例如,在UsersController,你可能想要做這樣的事情:

    public function beforeFilter() { 
        parent::beforeFilter(); 
    
        $this->Auth->deny('*'); 
        $this->Auth->allow('login', 'logout'); 
    } 
    
  • 在景色,那裏確定用戶是否通過測試Auth.User值來確定顯示什麼/隱藏來自匿名身份驗證/認證:

    if($this->Session->check('Auth.User')) { ... } 
    
  • 如果密碼更改,可以透明地通過調用$this->Auth->login($user_data)重新認證用戶。我這樣做,例如,當用戶註冊時。我不希望他/她必須再登錄,所以我只是自動登錄。

+0

謝謝,我已經足夠從好的方向開始 – J4N

0

有了驗證,就需要有完全相同2場(您可以指定)進行身份驗證上。一個字段(密碼)將被散列。是的,您需要的所有訪問級別都可以在Auth中指定:http://book.cakephp.org/view/1251/Setting-Auth-Component-Variables

您必須管理密碼更改,但如果用戶更改密碼,則不會註銷。

有時我需要,只有視圖的一部分不顯示(不顯示e.g。login元素)

WUT?

+0

我認爲他意味着在視圖中有一個if語句,只顯示某個HTML片段等,如果用戶通過身份驗證。我猜你可以用if(!$ this-> Auth-> user()){}來做到這一點,但我不確定如何使它更精細。 – Joseph

+0

@Joseph:是的,但我只需要知道用戶是否已通過身份驗證,所以它應該足夠了 – J4N

0

創建一個自定義登錄(),嘗試通過任一方法進行身份驗證。 您也可以設置Authenticate變量來執行自定義登錄。

您可以在不同的控制器中指定Auth允許認證用戶的部分。見Auth methods

您也可以使用ACL(請參閱完整的Cake ACL教程等)來控制粒度權限。

有時我需要,只有視圖的一部分不被顯示

創建該檢查Auth-元素>用戶(),選擇什麼樣的內容來顯示。

0

驗證不會完全按照您想要的方式進行。它只能處理是否需要用戶認證才能訪問某個動作。用戶登錄後,Auth不再關心用戶的級別訪問權限。

如果您希望使用兩個以上的字段,我建議您擴展AuthComponent並重寫登錄方法以滿足您的需求。我從來沒有做過,但我認爲這是相當容易的。

關於您的訪問級別,我會使用ACL來管理對所有控制器的操作的訪問。設置完成後,您必須手動設置每個操作的權限,可以使用社區編寫的插件之一或手動設置。

如果您希望禁用部分視圖,則需要閱讀權限以從此處測試用戶的訪問級別。一個好的方法是在用戶登錄時在緩存文件或會話中保存權限,以使其在視圖中可用。然後編寫測試並回應需要的內容。

(我使用CakePHP 2.0,我不知道該怎麼輕易就可以,如果你使用它在1.3擴展AuthComponent)

+0

ACL可能對此有點矯枉過正,我只需要「驗證」或不需要 – J4N

0

對於允許和拒絕的一部分能夠與驗證組件輕鬆完成。

使用類似

$this->allow('*'); // to allow every thing 
$this->deny('*'); // to deny every thing 
$this->allow('login', 'signup'); // allows login and sign up without being logged in 
$this->deny('profile', 'password'); // need to be logged into to access profile and password and rest of the actions are allowed. 

對於密碼的變化,你可以保存更改的密碼數據庫和力註銷用戶和重定向他再次

$this->Auth->logout(); this forces the user to logout of cakephp Auth 

登錄對於第一個問題 - 使用電子郵件或客戶ID登錄不可能直接使用cakephp Auth組件,因爲您將不得不定義它們中的哪一個充當用戶名。

另一種解決方案是,您可以將Auth Component複製到您的應用程序/控制器/組件並破解代碼。 當您收到用戶名稱時,您可以針對電子郵件和客戶ID進行測試並維護流量。

希望這有助於

+0

這似乎是我需要的,但代碼必須在哪裏?在每個控制器?在有關的控制器?在一個控制器的具體方法?這是一個恥辱,我們不能自己做一個身份驗證 - >登錄()與新憑據 – J4N

+0

在控制器的beforeFilter()中添加此。 –