会话在用户认证/登录中的作用?

会话在用户认证/登录中的作用?

问题描述:

我希望有人能帮我解决我提出的问题。会话在用户认证/登录中的作用?

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

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

我的问题是Session对象在登录其账户的用户中扮演什么角色?

什么其他的方法可能一个建议我去处理用户登录,因为它现在我觉得好像我在我的Session对象乐极生悲包裹起来的立场。

+0

我有一个类似的问题,我在考虑存储一些东西到APC缓存或内存缓存所以它是在内存中,而不是基于文件的会话或数据库会话 – JasonDavis 2010-01-22 04:15:29

只需调用您的身份验证方法应触发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']); 
} 
+0

就这样我正确理解你,你建议我直接进行身份验证,然后获取结果并将其存储在我的会话中?($ result = Auth :: authenticate($ email,$ psswd)){ Session :: set('user',$ result); } – Andre 2010-01-22 04:24:45

+1

没有与会话的所有交互操作都应该在auth类中。您不会在auth类之外访问会话中的auth值。 – prodigitalson 2010-01-22 04:27:29

+0

当你说auth值时,只需要澄清一下,我认为它是用来验证用户名和密码的凭证。 – Andre 2010-01-22 05:06:53

会议是抱着要在某种状态的在不同的页面已经管理或如果你需要快速访问的方式得到它而无需访问数据库的用户数据的好地方。在会话中保留安全信息(re:密码/ etc)是个不错的主意,但是快速访问信息(如用户名,姓名,电子邮件地址,首选项等)都是放入会话的好数据。尽量保持简单。

请记住,会话(或相关的cookie)只能用于识别。它不应该用于认证。

认证对象是一个好方法。确保它只保存安全信息,只要它具有所需的所有必要功能以保护敏感数据。

+1

我同意,所以存储密码不在存储的用户数据列表中。 – Andre 2010-01-22 04:27:02