2015-04-21 2 views
3

Я разрабатываю сервер API RESTful, который требует от некоторых из его методов API действительного сеанса, указанного в виде файла cookie с идентификатором сеанса.Yii всегда запускает сеанс, когда я касаюсь CWebUser

Я использую Yii v1.1.15 с помощью обработчика сеанса PHP (возможно, «файлы»).

Дело в том, что при каждом вызове CWebUser он создает сеанс, и я не хочу этого. Сеанс должен существовать только тогда, когда я его явно создаю, что означает логин (или регистр, который автоматически регистрирует пользователей). Например, если в определенном методе API проверить, является ли пользователь гость, используя конструкцию, которая включает в себя:

Yii::app()->user->isGuest 

он автоматически создает сеанс, так как этот код в CWebUser.init дал().

Теперь я не спешу менять CWebUser (на самом деле, чтобы изменить это в уже расширяющемся классе, который немного изменил его, в других аспектах), поскольку я боюсь, что это будет иметь непредвиденное влияние на система.

Может ли кто-нибудь просветить меня на этом?

Что вы хотите сделать?

Спасибо!

Окружающая среда:


// Yii v1.1.15 
// session component configuration: (but believe me, I've tried every 
// combination - its not really related. Check CWebUser.init()...) 
'session' => array(
      'class' => 'CHttpSession', 
      'autoStart' => false, 
      'sessionName' => 'MY_COOKIE_NAME', 
      'cookieMode' => 'allow', 
      'cookieParams' => ['lifetime' => 1000], 
      'gcProbability' => 33, 
      'timeout' => 1000, 
      'savePath' => '/tmp/', 
     ), 
// Web User's _allowAutoLogin_ is set on 'false' 

ответ

1

Таким образом, вы должны проверить, если пользователь вошел в систему (Вот почему вы используете isGuest), но вы не хотите использовать сеанс?

В методе isGuest используется переменная сеанса, чтобы проверить, вошел ли пользователь в систему. Сессия открывается при создании CWebUser. (в методе , как вы сказали.) isGuest является частью класса CWebUser. Если вы хотите вызвать этот метод, он всегда будет создавать сеанс. Если вы не перезапишете его.

Я думаю, что вы можете пойти 2 способами на это:.

  1. открыть сеанс, проверить, если пользователь вошел в систему (isGuest), а затем закройте его, только если пользователь не вошел в систему Вам потребуется для перезаписи метода isGuest. Перезапишите любые другие методы, чтобы открыть сеанс, когда он вам нужен. (login/register)
  2. Пусть клиент отправляет свои данные для входа по каждому запросу, поэтому вам не нужно проверять сеанс и, следовательно, не нужно его открывать.

В обоих случаях вам нужно будет переписать CWebUser.init() поэтому он не будет открывать сессию всякий раз, когда CWebUser создается.

0

Поэтому в основном все это было нужно, что пришло из следующего набора требований:

  • Yii будет использоваться (также) в качестве RESTful API сервера.
  • Сервер RESTful установит только после успешный вход.
  • Из приведенного выше пункта следует, что cookie для гостевых пользователей отсутствует, но он существует только для аутентифицированного сеанса пользователя.

Преимущества вышеуказанного? в основном «свободный» управление сеансов регистрации на фондовой PHP сессии, включая тайм-ауты, вывоз мусора и т.д.

Несмотря на первоначальный привлекательный дизайн этого, недостаток преодолел преимущества:

  • Действительно, isGuest является свойство CWebUser, которое при тестировании уже подразумевает сеанс, сгенерированный для запроса.
  • Попытка изменить описанное выше поведение вызвала множество проблем и ошибок, и бог знает, что скрывалось впереди. По сути, попытка изменить это поведение на Yii v1.1.x была слишком проблематичной, поскольку многие встроенные функции и поведение (в абстрактном значении ...) приложения на основе Yii неявно используют установленный сеанс.

Итак, я вернулся к следующей конструкции:

  • управления сеансом Yii был вернулся на склад - да пожалуйста! откройте сеанс для всего, что происходит! (просто делайте это хорошо, как обычно).
  • Сервер RESTful отправляет явный токен сеанса при успешных входах в систему.
  • Клиент должен сохранить этот токен и отправить его явно с помощью каждого метода API, который требует аутентифицированного сеанса.
  • Серверная сторона сохраняет токен сеанса в сеансе «свободно управляемый» (PHP) и, таким образом, может проверить на каждом отдельном запросе, что токен для пользователя с PHP-сессия действительно является его и действительна.
Смежные вопросы