2013-01-07 121 views
0

我使用cakephp 2和AuthComponent一起对我的web应用程序上的用户进行身份验证。至关重要的是,用户不会自动注销很长一段时间(至少24小时,更长或无限是最好的)。原因是我们在cakephp webapp中存储了许多必须在几秒钟内可供当前登录用户使用的内容,而不会强制他输入密码。为此,我已经设置Security.levellow,我还实施防止自动注销cakephp

Configure::write('Session.timeout', 3000); 

这应该给用户一个很好的两天了他被注销了。然而,即使用户已经在同一分钟内处于活动状态,用户仍会不时注销。我不知道它何时发生,以及如何重现它,但我想知道我是否可能错过了某些东西,其他策略可能有助于解决我的问题。

作为一个网络服务器,我在Ubuntu 12.04上使用标准apache,没有任何特殊的配置更改!

回答

0

为了让这项工作有效地进行,您将分两部分进行。我不能专门针对您正在使用的组件,但我可以提供一般操作理论。

PHP会话永远不应该被认为会持续很长时间。当用户在网站上时,它们将处于活动状态,但最终会清理干净。那么如何让用户会话“永不过期”?

当用户登录时,您将创建一个唯一的一次散列。这个散列将作为一个cookie存储在用户中,你也应该在你的数据库中引用它(散列关联的用户)

这个散列提供了另一种登录路径。如果用户返回到站点并且没有会话,而不是将其指向登录页面,则会看到用户是否拥有cookie。如果他们这样做,您可以将它们重新登录。

现在它的重要性在于只允许使用该散列一次。在散列用于创建会话之后,您需要生成一个新的散列并使用新散列更新cookie和数据库。

有些事情要记住:

  • 哈希应该是唯一的,并用随机数据生成。它应该不是一件容易被伪造的东西。
  • 如果用户使用多个设备访问您的网站,其可能的每个设备都将拥有自己独特的散列,请牢记使用 数据库设计。
  • 它是一个好主意,使用SSL,以便哈希不容易被嗅探。
  • 散列应该在一定的时间内过期,以便旧的散列不能用于登录到该网站。
+0

这是一个非常好的主意,我非常喜欢它,虽然使用标准的cakephp AuthComponent很难实现。两个问题:散列应该多久?为什么在创建新会话时必须重新生成? – schneida

+0

长度不是一个问题,最重要的是唯一性和伪造哈希的难度。 'md5($ userid)'会很糟糕。它使得哈希可预测。像'md5(microtime())'可能工作得很好。由于cookie存储在客户端,因此它们可以被第三方读取。您可以为用户提供散列,并且无需用户名或密码即可登录。如果哈希得到重新生成并且只允许使用一次,它会减少持久会话的安全风险。 – datasage

+0

姆姆,所以如果一个坏的用户将cookie复制到他的浏览器,他将能够登录到系统,并且因为cookie被重新生成,真正的用户将被注销,因为他的cookie现在不再有效。那么我认为这对我来说已经足够了!非常感谢! – schneida

0
CREATE TABLE cake_sessions (
    id varchar(255) NOT NULL default '', 
    data text, 
    expires int(11) default NULL, 
    PRIMARY KEY (id) 
); 

然后在core.php中改变会话设置:

Configure::write('Session', array(
    'defaults' => 'database', 
    'timeout' => 43200, 
    'cookieTimeout' => 43200 
)); 

此设置为1个月会话