Вопрос по session – Компонент авторизации Cakephp с сессией двух моделей

13

У меня есть два приложения cakephp2, работающие в одной базе данных, но с разными таблицами аутентификации и разными значениями $ this-> gh; userModel соответственно. Аутентификация работает хорошо, и пользователи из одного приложения не могут войти в другое.

НО .. поскольку приложения используют тот же файл cookie сеанса CAKEPHP, это происходит: когда пользователь из приложения «один»; войдя в систему, он может получить доступ к любому действию, защищенному аутентификацией, в приложении «два»!

Я, вероятно, буду использовать разные роли пользователей и имена файлов cookie. Но все же, почему компонент Auth игнорирует настройки Auth-> userModel при проверке сеанса? Есть ли способ настроить его на работу в этой ситуации?

Спасибо заранее за любые предложения.

Это неправильно @tigrang, по крайней мере, для 2.0. burzum
Я поклялся, что видел это жестко, когда смотрел на источник на днях - должен был дважды проверить, мой плохой. tigrang
Я не знаю, имеет ли это какое-либо отношение к этому, но когда AuthComponent сохраняет пользователя в сеансе, он используетUser всегда независимо от того, как на самом деле называется пользовательская модель - она жестко запрограммирована. tigrang
Увидетьbook.cakephp.org/2.0/en/core-libraries/components/… и еще раз это было исправлено 1,3 года назад, на самом деле это была проблема - в прошлом. :) burzum

Ваш Ответ

3   ответа
3

У меня похожая проблема, поэтому я и получил награду за этот вопрос. По сути, у меня есть общедоступная часть приложения, которая позволяет пользователям входить из одной таблицы, и административная часть приложения, которая позволяет администраторам входить из другой таблицы. Мой AppController выглядит примерно так:

public $components = array(
    'Session',
    'Auth' => array(
        'autoRedirect' => false,
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'User'
            )
        ),
        'loginAction' => array('controller' => 'users', 'action' => 'login'),
        'loginRedirect' => array('controller' => 'users', 'action' => 'overview'),
        'logoutRedirect' => array('controller' => 'users', 'action' => 'loggedout')
    )
);

и у меня есть другой AdminController, где у меня есть это:

public $components = array(
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'CustomForm' => array(
                'userModel' => 'Admin'
            )
        ),
        'loginAction' => array('controller' => 'admin', 'action' => 'login'),
        'loginRedirect' => array('controller' => 'admin', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'home', 'action' => 'index')
    )
);

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

Я рад, что вы подняли награду. Я также узнал кое-что дополнительное при реализации этого: настройка области действия вAuth вAppController создает проблему с несколькими логинами.'scope' => array('User.delete_status' => 0) вAppController не был перезаписан'scope' => array('Customer.delete_status' => 0) вCustomersController, Вместо этого, он был добавлен в SQL-запрос, используемый Cake, как.. WHERE User.delete_status=0 AND Customer.delete_status=0, Мне пришлось переместить этот бит в UsersController из AppController (как у вас естьAuth в соответствующих контроллерах).
0

Расширьте обработчик сеанса Model / Datasource / Session / DatabaseSession.php с помощью чего-то вроде MyDatabaseSession и перезапишите методы write и read. Может быть, просто скопировать существующий код обоих методов и добавить что-то вроде

& APOS; app_id & APOS; = & GT; Настройка :: чтения (& APOS; App.appId & APOS;)

к условиям read () и сделайте то же самое в методе write. И не забудьте добавить поле в схему базы данных сеанса инастроить сеанс для использования вашего обработчика.

<?php
App::uses('DatabaseSession', 'Model/Datasource/Session');
class ExtendedDatabaseSession extends DatabaseSession  {

    public function read($id) {
        $row = $this->_model->find('first', array(
                'conditions' => array(
                    'app_id' => Configure::read('App.appId'),
                    $this->_model->primaryKey => $id)));

        if (empty($row[$this->_model->alias]['data'])) {
            return false;
        }

        return $row[$this->_model->alias]['data'];
    }

    public function write($id, $data) {
        if (!$id) {
            return false;
        }
        $expires = time() + $this->_timeout;
        $record = compact('id', 'data', 'expires');
        $record[$this->_model->primaryKey] = $id;
        $record['app_id'] = Configure::read('App.appId');
        return $this->_model->save($record);
    }
}

Я не знаю ваше приложение, поэтому, если вы записали идентификатор приложения в данные конфигурации, возможно, загрузчик или beforeFilter (). Вы должны добавить его до инициализации сеанса, я думаю, или вам нужно будет повторно инициировать сеанс или что-то в этом роде. Я оставляю это на ваше усмотрение, чтобы посмотреть правильную точку вверх. :)

11

Если не настроено иначе, AuthComponent запишет аутентифицированную запись пользователя вAuth.User сеансовый ключ в CakePHP 2.Но это можно изменить:

AuthComponent::sessionKey

The session key name where the record of the current user is stored. If unspecified, it will be "Auth.User".

(В CakePHP 1,3это было по-другому: Auth.{$userModel name})

Итак, если ваши приложения совместно используют сеанс, что они делают, если имя файла cookie иSecurity.salt совпадение, вошедшая в систему запись будет опубликована.

Есть две возможности решить эту проблему:

Separate the logins

Просто установите другойAuthComponent::sessionKey для ваших двух моделей. Это позволит им сохранить зарегистрированного пользователя отдельно

Separate the sessions

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

Ключ сеанса не создаст новый или другой сеанс, а просто изменит место хранения данных аутентификации в текущем сеансе.
Ваше первое решение сработало! Я сделал: AuthComponent :: $ sessionKey = & gt; Auth.MyCustomModel & apos;
Как использовать сессионный ключ в cakephp 3?
Да, точно. Это предотвратит два приложения & apos; Аутентификация для вмешательства. Создание совершенно другого сеанса - мое второе решение.

Похожие вопросы