Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 会话在用户身份验证/登录中的角色?_Php_Authentication_Session_Login - Fatal编程技术网

Php 会话在用户身份验证/登录中的角色?

Php 会话在用户身份验证/登录中的角色?,php,authentication,session,login,Php,Authentication,Session,Login,我希望有人能帮我解决一个问题 我有一个处理一般会话数据存储的会话对象,还有一个验证用户凭据的身份验证对象 最初,我将所需的身份验证类名传递给会话对象,然后使用一个登录方法创建身份验证对象的实例并验证凭据。我将验证结果存储在会话变量中,并通过getter使其可用。用户数据也存储在会话中以供以后使用。除此之外,我还有一个注销方法,它从会话中删除用户数据,从而注销用户 我的问题是会话对象在用户登录其帐户时应该扮演什么角色 还有什么其他方法可以建议我去处理用户登录,就目前而言,我觉得自己似乎太专注于会话

我希望有人能帮我解决一个问题

我有一个处理一般会话数据存储的会话对象,还有一个验证用户凭据的身份验证对象

最初,我将所需的身份验证类名传递给会话对象,然后使用一个登录方法创建身份验证对象的实例并验证凭据。我将验证结果存储在会话变量中,并通过getter使其可用。用户数据也存储在会话中以供以后使用。除此之外,我还有一个注销方法,它从会话中删除用户数据,从而注销用户

我的问题是会话对象在用户登录其帐户时应该扮演什么角色


还有什么其他方法可以建议我去处理用户登录,就目前而言,我觉得自己似乎太专注于会话对象了。

会话是一个很好的地方,可以保存用户数据,这些数据是您希望在不同页面上以某种状态管理的,或者如果您需要一种快速可访问的方式来获取,而不需要访问数据库。在会话中保留安全信息(re:passwords/etc)是个坏主意,但是快速访问信息,如用户名、姓名、电子邮件地址、首选项等,都是会话中的好数据。不过要尽量保持简单

但是请记住,会话(或相关cookie)只应用于标识。它不应用于身份验证


身份验证对象是一种很好的方法。确保它只保存所需的安全信息,并且具有所有必要的功能来保护敏感数据。

只要调用身份验证方法,就会触发
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'); 
   }
}
[…]就目前情况而言,我觉得 虽然我有太多的事情要做 在我的会话对象中

我同意。对于身份验证/凭据,您应该仅与身份验证/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']);
}

我有一个类似的问题,我正在考虑将一些内容存储到APC缓存或Memcache中,这样它就可以存储在内存中,而不是基于文件的会话或数据库会话。只是为了让我正确地理解您,您建议我直接进行身份验证,然后获取结果并将其存储在会话中?大致如下:if($result=Auth::authenticate($email,$psswd)){Session::set('user',$result);}与会话的所有交互操作都不应在Auth类中。。您不应该在auth类之外访问会话中的auth值。请澄清一下,当您说auth值时,我认为它是指用于身份验证的凭据,这些凭据是用户名,更具体地说是密码。您不应该在会话中存储密码或任何其他特权信息。。。我的意思是,例如数据库中该用户的用户名和pk,或者可能是“访问组”列表或其他内容。存储的信息与Joel Etherton在其回复中引用的内容一致,即电子邮件地址、用户名、帐户首选项。所以只有那些与用户相关的东西。您也提到了它,但它不在您的示例中,但您的建议是,注销操作也由Auth对象执行--可能是以反身份验证方法的形式进行的。我同意,因此存储的用户数据列表中没有存储密码。