2012-06-21 14 views
5

Mam stronę Cake i muszę mieć dwa oddzielne loginy, każdy będzie miał swój własny formularz logowania i zobacz inne strony, byłoby miło mieć dwie różne tabele, ponieważ nie ma podobieństw między dwa rodzaje ludzi.CakePHP 2 oddzielne tablice logowania

Każdy formularz logowania będzie używany tylko przez określone osoby i nigdy nie zaloguje się do drugiej postaci i na odwrót.

Ponadto, dwie tablice logowania mają relację między nimi, co wymaga 2 tabel?

Czy to możliwe?

+1

To nie wygląda tak, jak trzeba, ale do starszej wersji z masłem, a może @deizel zobaczymy :) – 472084

+0

Ten sam rodzaj pojęcia, z wyjątkiem "identyfikatora" został przeniesiony do obiektów uwierzytelniających i nazywa się "uwierzytelnianie" (lub konkretnie "_findUser" na "BaseAuthenticate"). – jeremyharris

+0

Po prostu zmień "identyfikujące" na "uwierzytelnianie"? http://codepad.viper-7.com/1BX9fE – 472084

Odpowiedz

10

Najpierw dodaj kilka pustych niestandardowych obiektów uwierzytelniających. Wykorzystamy ponownie tę samą logikę, której używa FormAuthenticate (to znaczy używa danych POST do sprawdzenia bazy danych dla użytkownika), ale po prostu zmienimy model w ustawieniach obiektu (później).

app/Controller/Component/Auth/ModelOneAuthenticate.php

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

class ModelOneAuthenticate extends FormAuthenticate { 
} 

app/Controller/Component/Auth/ModelTwoAuthenticate.php

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

class ModelTwoAuthenticate extends FormAuthenticate { 
} 

Następnie poinformować aplikację do korzystania te obiekty do uwierzytelnienia i powiedz, jakiego modelu użyć. Tutaj możesz również dostosować pola. W swojej 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' 
      ) 
     ) 
    ) 
); 

Pierwszym celem uwierzytelnienia by sprawdzić tabelę model_ones o podanie nazwy użytkownika i hasła w my_custom_username_field w some_password_field, natomiast drugi będzie sprawdzić model_twos użyciu standardowych username i password pól.

+0

Dzięki za to! Zrobiłem do tej pory cały kod i żadnych błędów, ale kiedy wchodzę na ograniczoną stronę, próbuje przejść do użytkowników/zalogować się, kiedy mówię, że idę do agentów/login - ay pomysły dlaczego? Oto, co mam: http://codepad.org/zvBeJFEX – 472084

+0

Musisz ustawić właściwość loginRedirect: http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html# AuthComponent :: $ loginRedirect – jeremyharris

+0

Ustawiłem to tak: http://codepad.org/zvBeJFEX - Czy powinienem jakoś dodać go do nowo utworzonych klas auth? – 472084

1

Gdy muszą się zalogować, istnieje podobieństwo: Obie będą wymagać wprowadzenia danych uwierzytelniających, zwykle nazwy użytkownika/adresu e-mail i hasła. Tak więc tabela użytkowników i tabela foo_profiles oraz tabela bar_profiles w zależności od typu użytkownika powinny również działać.

Jeśli naprawdę chcesz korzystać z dwóch różnych tabel i stosu MVC, po prostu użyj dwóch różnych kontrolerów FooUsers i BarUsers, a wewnątrz każdej utwórz spersonalizowaną metodę logowania.

+0

Każdy z 2 typów użytkowników będzie musiał tylko zalogować się do jednej postaci, nigdy drugiej. każdy formularz wymaga innego konta użytkownika. Czy znasz jakieś zasoby, aby pomóc w "tworzeniu niestandardowej metody logowania". Dzięki. – 472084

+0

Tak, sprawdź ten tutorial: http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html W metodzie logowania po prostu wykonaj wszystkie wymagania. – burzum

+0

Nie widzę żadnej pomocy na temat dwóch tablic logowania, czy po prostu przesunąłbym kod, który ma umieścić AppController na osobnym kontrolerze? – 472084

1

Zrobiłem to wcześniej, pisząc niestandardowe komponenty Authentication, które rozszerzają się od BaseAuthenticate. Dopóki implementują metodę authenticate(), będziesz mógł robić, co chcesz, dla każdego z różnych typów użytkowników.

W swojej AppController trzeba rejestrować różne komponenty wykonując coś jak

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

Zapoznaj się z cookbook za resztą.

+0

Czy mógłbyś udostępnić część użytego kodu? (dla niestandardowego obiektu uwierzytelniania) – 472084

+0

Wolałbym nie TBH. Istotą tego jest jednak to, że jeśli jesteś zadowolony z uwierzytelnionego użytkownika, zwracasz tablicę, która następnie zostaje zapisana w $ auth-> user. Jeśli nie jesteś zadowolony, zwrócisz "false", a Cake z tym poradzi sobie. Podany link prowadzi do odpowiedniej sekcji kontrolera uwierzytelniania. –

+0

Tak więc wewnątrz nowego obiektu uwierzytelniania musiałbym po prostu powiedzieć '(jeśli login i hasło odpowiadają tabeli 1) {return $ row1; } elseif (tabela dopasowania loginu i hasła 2) {return $ row2; } else {return false; } '?? – 472084

2

Najprostszym sposobem, aby to zrobić, to po prostu ustawić inny klucz sesji dla każdego typu logowanie:

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'; 


} 
Powiązane problemy