CakePHP 2 отдельные таблицы входа

У меня есть веб-сайт Cake, и ему нужно иметь два отдельных входа в систему, каждый из которых будет иметь свою собственную форму входа и видеть разные страницы, было бы неплохо иметь две разные таблицы, потому что между двумя типами людей нет сходства.

Каждая форма входа будет использоваться только определенными людьми, и они никогда не войдут в другую форму, и наоборот.

Кроме того, между двумя таблицами входа есть связь, для которой требуется 2 таблицы?

Это возможно?


person 472084    schedule 21.06.2012    source источник
comment
Это похоже на то, что мне нужно, но для более старой версии Cake, возможно, @deizel увидит это :)   -  person 472084    schedule 22.06.2012
comment
Такая же концепция, за исключением того, что identify был перемещен в объекты аутентификации и называется authenticate (или, в частности, метод _findUser для BaseAuthenticate).   -  person jeremyharris    schedule 22.06.2012
comment
Так что просто изменить identify на authenticate? codepad.viper-7.com/1BX9fE   -  person 472084    schedule 22.06.2012
comment
Не совсем. Опубликовал ответ, который, надеюсь, прояснит для вас систему аутентификации. Когда он аутентифицируется, он пробует каждый объект. Мы создали собственные объекты (дублирующие логику FormAuthenticate), которые используют разные модели/таблицы. Если первый терпит неудачу, Cake пробует второй.   -  person jeremyharris    schedule 22.06.2012


Ответы (4)


Во-первых, добавьте пару пустых пользовательских объектов аутентификации. Мы будем повторно использовать ту же логику, что и FormAuthenticate (то есть использует данные POST для проверки базы данных на наличие пользователя), но просто изменим модель в настройках объекта (позже).

app/Controller/Component/Auth/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_field и пароля в some_password_field, а второй проверит model_twos, используя стандартные поля username и password.

person jeremyharris    schedule 21.06.2012
comment
Спасибо за это! Я сделал весь код и пока никаких ошибок, но когда я перехожу на страницу с ограниченным доступом, он пытается перейти к пользователям/логину, когда я сказал перейти к агентам/логину - есть идеи, почему? Вот что у меня есть: codepad.org/zvBeJFEX - person 472084; 22.06.2012
comment
Вам нужно будет установить свойство loginRedirect: book.cakephp.org/2.0/en/core-libraries/components/ - person jeremyharris; 28.06.2012
comment
Я установил это так: codepad.org/zvBeJFEX — нужно ли мне добавить его во вновь созданные классы аутентификации? вместо этого как-то? - person 472084; 28.06.2012
comment
Ах, как плохо, вам нужно установить правильную переменную loginAction. loginRedirect — это место, куда они переходят после входа в систему. book.cakephp.org/2.0/ ru/основные библиотеки/компоненты/ - person jeremyharris; 28.06.2012
comment
Как я могу указать отдельные loginRedirect, logoutRedirect и loginAction для обоих типов пользователей? - person Shubham; 03.05.2013
comment
@ShubhamAggarwal Точно так же, как вы назначаете другие свойства. Помните, что это простые оболочки для FormAuthenticate, поэтому все его методы и свойства применяются так, как если бы вы использовали FormAuthenticate. В книге есть и более подробная информация об этом. - person jeremyharris; 03.05.2013
comment
Я указал эти параметры в функции beforeFilter в соответствии с контроллерами. Работает хорошо! - person Shubham; 05.05.2013
comment
Привет. Как я могу использовать это в одном контроллере? - person Ricbermo; 22.05.2013
comment
@Ricbermo они являются частью уровня компонентов, поэтому просто скажите компоненту аутентификации на этом контроллере использовать эти классы для аутентификации. - person jeremyharris; 22.05.2013
comment
@jeremyharris, не могли бы вы взглянуть на это?: stackoverflow.com/questions/16693998/ - person Ricbermo; 22.05.2013
comment
@ShubhamAggarwal, можете ли вы рассказать мне, как вы это сделали, используя beforeFilter, или просто куда вы поместили код и какой код, пожалуйста, помогите мне, так как я новичок в cakephp и все еще учусь. Спасибо! - person Sagar Guhe; 16.10.2014

Самый простой способ сделать это — установить разные ключи сеанса для каждого типа входа:

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';  
}
person Singletonio    schedule 30.10.2012

Когда им нужно войти в систему, есть сходство: оба потребуют ввести учетные данные, обычно имя пользователя / адрес электронной почты и пароль. Таким образом, таблица пользователей, таблица foo_profiles и таблица bar_profiles в зависимости от типа пользователя также должны работать.

Если вы действительно хотите использовать две разные таблицы и стек MVC для них, просто используйте два разных контроллера FooUsers и BarUsers и внутри каждого создайте настраиваемый метод входа.

person floriank    schedule 21.06.2012
comment
Каждому из двух типов пользователей нужно будет входить только в одну форму, а не в другую. для каждой формы требуется отдельная учетная запись пользователя. Знаете ли вы какие-либо ресурсы, которые помогут создать индивидуальный метод входа в систему. Спасибо. - person 472084; 21.06.2012
comment
Да, ознакомьтесь с этим руководством: book .cakephp.org/2.0/en/tutorials-and-examples/ В методе входа просто сделайте все, что вам нужно. - person floriank; 21.06.2012
comment
Я не вижу никакой помощи в наличии двух таблиц входа в систему, могу ли я просто переместить код, который он говорит, чтобы поместить в AppController, на его отдельный контроллер? - person 472084; 21.06.2012
comment
Если у вас есть одна таблица пользователей, используйте действие UsersController::login(). Метод может принимать аргумент, чтобы различать типы пользователей и отображать другое представление, вызывая render('something') в зависимости от типа. Вы также можете просто использовать другой метод, такой как UsersController::foo_login() и ::bar_login(). Я не знаю вашей настоящей цели, все зависит от того, что вы хотите сделать и насколько велики различия. Вы подразумевали, что хотите использовать 2 таблицы для каждого типа пользователя. Я ничего не говорил о наличии таблицы login! - person floriank; 21.06.2012
comment
Спасибо за ответы! По сути, у меня есть веб-сайт, на который могут войти несколько агентов по недвижимости, агенты по недвижимости могут создавать учетные записи для своих клиентов, желающих купить дом и т. д. Данные, хранящиеся для каждого клиента, не имеют ничего общего с данными, которые хранятся для каждого агента по недвижимости. , они также имеют доступ к различным частям веб-сайта. Я хочу сделать это так, как вы предложили, поскольку это проще, чем ответ ниже, но хочу убедиться, что это правильное решение. Еще раз спасибо. - person 472084; 21.06.2012

Я сделал это ранее, написав пользовательские компоненты аутентификации, которые расширяются от BaseAuthenticate. Пока они реализуют метод authentication(), вы сможете делать все, что захотите, с каждым из различных типов пользователей.

В вашем AppController вам нужно зарегистрировать различные компоненты, выполнив что-то вроде

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

Ознакомьтесь с поваренной книгой для всего остального.

person Rob Forrest    schedule 21.06.2012
comment
Не могли бы вы поделиться кодом, который вы использовали, пожалуйста? (для пользовательского объекта аутентификации) - person 472084; 21.06.2012
comment
Я бы предпочел не ТБХ. Суть его в том, что если вы довольны аутентифицированным пользователем, вы возвращаете массив, который затем сохраняется в $auth-›user. Если вы недовольны, вы возвращаете «false», и Cake справится с этим. Ссылка, которую я предоставил, ведет в соответствующий раздел контроллера аутентификации для вас. - person Rob Forrest; 21.06.2012
comment
Итак, внутри нового объекта аутентификации мне просто нужно сказать (if login & password match table 1){ return $row1; }elseif (login and password match table 2){ return $row2; }else{ return false; } ?? - person 472084; 21.06.2012
comment
Не совсем. Лучше всего настроить компонент аутентификации для каждого типа пользователя. В каждом из них у вас будет (если логин и пароль соответствуют таблице 1) { return $row 1} else { return false}, а затем в другом компоненте (если логин и пароль соответствуют таблице 2) { return $row 1} else { вернуть ложь}. Порядок, в котором вы регистрируете их в массиве аутентификации (показан выше), является порядком, в котором они проверяются. Второй компонент проверяется тогда и только тогда, когда первый выходит из строя. - person Rob Forrest; 22.06.2012