Роль сессии в аутентификации пользователя / логине? - PullRequest
2 голосов
/ 22 января 2010

Я надеялся, что кто-нибудь может помочь мне с вопросом, на который я пришел.

У меня есть объект Session, который управляет хранением общих данных сеанса, у меня также есть объект Authentication, который проверяет учетные данные пользователя.

Первоначально я передал желаемое имя класса аутентификации моему объекту Session, затем имел метод входа в систему, который создал экземпляр объекта аутентификации и проверил учетные данные. Я сохранил результат этой проверки в переменной Session и сделал его доступным через геттер. Пользовательские данные также были сохранены в сеансе для последующего использования. В дополнение ко всему этому у меня есть метод выхода из системы, который удаляет данные пользователя из сеанса и, таким образом, выводит пользователя из системы.

У меня вопрос, какую роль должен играть объект Session при входе пользователей в свою учетную запись?

И что еще можно предложить, если я займусь обработкой входа пользователя, как сейчас, я чувствую, как будто я слишком занят в своем объекте Session.

Ответы [ 2 ]

3 голосов
/ 22 января 2010

Простой вызов вашего метода authenticate должен вызвать логику в Auth для сохранения надлежащих данных в сеансе (или в другом хранилище данных), а Auth также должен использоваться исключительно для получения / отзыва этой информации. Поэтому, используя пример из вашего комментария, это может быть:

class Auth {
  public static function authenticate($identity, $pass)
  {
     // do lookup to match identity/pass if its good then

     /* assume $auth is an array with the username/email or 
        whatever data you need to store as part of authentication */
     Session::set('auth', $auth);
     return true;

     // if auth failed then 
     Session::set('auth', array('user'=>'anonymous'));
     return false;
  }

  public function isAuthenticated()
  {
     $auth = Session::get('auth');
     if(!$auth)
     {
       return false;
     }

     return (isset($auth['user']) && $auth['user'] !== 'anonymous'); 
   }
}

[...] как сейчас, я чувствую хотя я слишком заворачиваюсь в моем объекте Session.

И я согласен. В идеале для аутентификации / учетных данных вы должны взаимодействовать только с объектами Auth / Acl. Затем они будут использовать сеанс в качестве хранилища с сохранением состояния ... но вам не нужно заботиться о том, чтобы он даже сохранялся в сеансе. Код, использующий объект (ы) Auth / Acl, должен полностью не знать об этом факте.

Например:

//Bad

if($session->get('authenticated', 'auth'))
{
  // do stuff
}


// also bad

if(isset($_SESSION['authenticated']))
{
  // do stuff
}


//Good

if($auth->isAuthenticated())
{
  // do stuff
}

// inside $auth class it might look like this
public function isAuthenticated()
{
  $store = $this->getSotrage(); // assume this returns the $_SESSION['auth']
  return isset($store['authenticated']);
}
3 голосов
/ 22 января 2010

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

Имейте в виду, что сеанс (или связанный файл cookie) должен использоваться только для идентификации. Он не должен использоваться для аутентификации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...