2012-06-21 33 views
5

我有一個Cake網站,它需要有兩個單獨的登錄,每個登錄表單都會有自己的登錄表單並且看到不同的頁面,因此有兩個不同的表格會很好,因爲它們之間沒有相似之處兩種人。CakePHP 2個單獨的登錄表

每個登錄表單只會被某些人使用,他們將永遠不會登錄到其他表單,反之亦然。

此外,兩個登錄表之間有一個關係,它需要2個表?

這可能嗎?

+1

這看起來像什麼,我需要但對於舊版本的蛋糕,說不定@deizel會看到這個:) – 472084

+0

相同的概念,除了'identify'被移到了authenticate對象上,並被稱爲'authenticate'(或者''特別是'BaseAuthenticate'上的'_findUser'方法)。 – jeremyharris

+0

所以,只要將'identify'改爲'authenticate'? http://codepad.viper-7.com/1BX9fE – 472084

回答

10

首先,添加幾個空的自定義身份驗證對象。我們將重用FormAuthenticate使用的相同邏輯(即使用POST數據爲用戶檢查數據庫),但只需在對象設置中更改模型(稍後)即可。

應用程序/控制器/組件/認證/ ModelOneAuthenticate.php

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class ModelOneAuthenticate extends FormAuthenticate { 
} 

應用程序/控制器/組件/認證/ ModelTwoAuthenticate.php

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class ModelTwoAuthenticate extends FormAuthenticate { 
} 

然後告訴您的應用程序使用這些對象進行身份驗證,並告訴它使用什麼模型。您也可以在此自定義字段。在你的AppController:

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'ModelOne' => array(
       'userModel' => 'ModelOne', 
       'fields' => array(
        'username' => 'my_custom_username_field', 
        'password' => 'some_password_field' 
       ) 
      ), 
      'ModelTwo' => array(
       'userModel' => 'ModelTwo' 
      ) 
     ) 
    ) 
); 

第一認證對象將檢查model_ones表中my_custom_username_fieldsome_password_field用戶名和密碼,而第二個將使用標準usernamepassword領域檢查model_twos

+0

感謝您的支持!到目前爲止,我已經完成了所有的代碼並沒有錯誤,但是當我去一個受限制的頁面時,它會嘗試去用戶/登錄時,我已經說過要去代理/登錄 - 唉想法爲什麼?這是我的:http://codepad.org/zvBeJFEX – 472084

+0

你需要設置loginRedirect屬性:http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html# AuthComponent :: $ loginRedirect – jeremyharris

+0

我有這樣的設置:http://codepad.org/zvBeJFEX - 我需要將它添加到新創建的auth類,而不是某種方式嗎? – 472084

1

當他們必須登錄時有相似性:兩者都會要求它輸入憑據,通常是用戶名/電子郵件和密碼。所以用戶表和foo_profiles表和bar_profiles表也取決於用戶類型。

如果你真的想用兩個不同的表和他們的MVC堆棧,那麼只需使用兩個不同的控制器FooUsers和BarUsers,並在每個控制器內創建一個定製的登錄方法。

+0

這兩個用戶類型中的每一個都只能登錄到他們的一個表單,而不是另一個。每個表單都需要不同的用戶帳戶。 你知道任何資源來幫助「創建自定義登錄方法」嗎?謝謝。 – 472084

+0

是的,請查看本教程:http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html在登錄方法中,只需執行您的任何要求即可。 – burzum

+0

我不能看到有任何幫助有兩個登錄表,我只是將它說的把代碼放在AppController到它的單獨控制器的代碼? – 472084

1

我之前通過編寫擴展自BaseAuthenticate的自定義身份驗證組件來完成此操作。只要他們實現authenticate()方法,那麼你就可以爲每種不同類型的用戶做任何你想做的事情。

在你的AppController你需要做類似

public $components = array(
    "Session", 
    "Auth" => array(
     'authenticate'  => array("UserType1", "UserType2"), 
    ) 
); 

退房的cookbook爲它的其餘部分進行註冊的不同組件。

+0

你能分享你使用的一些代碼嗎? (用於自定義認證對象) – 472084

+0

我不想TBH。但它的本質是,如果您對經過身份驗證的用戶滿意,則返回一個數組,然後將其存儲在$ auth-> user中。如果你不開心,那麼你返回'假'和蛋糕處理。我提供的鏈接會將您帶到身份驗證控制器的相關部分。 –

+0

因此,在新的認證對象中,我只需要說'(如果登錄名和密碼匹配表1){return $ row1; } elseif(登錄和密碼匹配表2){return $ row2; } else {return false; }'? – 472084

2

要做到這一點最簡單的方法是隻爲每個登錄類型不同的會話密鑰:

if ($loginTypeOne) { 
    $this->Auth->authenticate = array(
    'Form'=> array(
     'userModel'=> 'TypeOne', 
    ) 
    ); 
    AuthComponent::$sessionKey = 'Auth.TypeOne'; 
} else { 
    $this->Auth->authenticate = array(
    'Form'=> array(
     'userModel'=> 'TypeTwo', 
    ) 
    ); 
    AuthComponent::$sessionKey = 'Auth.TypeTwo'; 
} 
0
You can have a look on this. 
Define Model for both login member and then define table which you want to use for the user. 
set variable in model. 


class SearchedCategory extends AppModel { 
    var $name = 'SearchedCategory'; 
    Var useTable = 'give your table name here.'; 
    var $primaryKey = 'id'; 


}