'记住我'在CodeIgniter中登录

时间:2009-01-07 10:59:54

标签: session codeigniter login

如何在CodeIgniter中实现它?

6 个答案:

答案 0 :(得分:33)

(这个回答是对原始问题的回答)

  

你会怎么做?或者,怎么会   你创建一个更长的会话   到期日超过其他人?

     

所有创建的会话都将使用   相同的$ config ['sess_expiration']在   配置文件(默认值:7200秒),   有没有办法传递自定义值   ?

延长会话cookie的到期时间不适用于“记住我”功能,因为用户在关闭浏览器时会丢失会话cookie。如果Code Igniter没有本机“记住功能”,那么你需要写一些东西来删除一个长寿命的cookie,其中包含的信息允许在服务器再次看到它时自动登录。

Persistent Login Cookie Best Practice上有一篇很好的文章,可以概括为:

  
      
  1. 当用户成功登录并选中记住我时,登录   cookie除了发布之外   标准会话管理cookie。2
  2.   
  3. 登录cookie包含用户的用户名和随机数   (来自这里的“令牌”)来自a   适当的大空间。用户名和   令牌在a中存储为一对   数据库表。
  4.   
  5. 当未登录的用户访问该网站并提供登录Cookie时,   查找用户名和令牌   在数据库中。        1.如果该对存在,则认为用户已通过身份验证。   已使用的令牌已从中删除   数据库。生成一个新令牌,   使用用户名存储在数据库中,   并通过新登录发给用户   曲奇饼。        2.如果该对不存在,则忽略登录cookie。
  6.   
  7. 仅通过此机制进行身份验证的用户是   不允许访问某些   受保护的信息或功能   比如更改密码,查看   个人识别信息,或   花钱。执行那些   操作,用户必须先   成功提交正常   用户名/密码登录表单。
  8.   
  9. 由于这种方法允许用户记住多个   来自不同浏览器的登录或   计算机,提供了一种机制   用户擦除所有记住的   登录一次操作。
  10.   

另一篇文章在Improved Persistent Login Cookie Best Practice

中为这些想法建立了更多安全性

如果你遵循这些文章中的做法,你就不会出错!

答案 1 :(得分:3)

您可能需要重新考虑“改进的持久登录Cookie最佳实践”中的建议。我在网站上发布了对问题的分析,但其主旨是:

  

如果没有安全线,您无法阻止Cookie窃取,无论

(*'安全线',我的意思是SSL / VPN隧道/公钥加密 - 或强大的挑战 - 响应方案*)

我完全支持持久登录最佳做法,但有一点是没有任何技巧可以提供帮助,唯一方式是SSL。

答案 2 :(得分:1)

感谢您的解决方案。 我已将此实现到我的CI项目中。

DEV注意:cookie应该有一个secure-hash作为remember-me键。 - 不要只存储用户ID) - 不要存储密码, - 并且不存储密码的哈希值。 这样人们就无法自动登录任何帐户。

最糟糕的情况:一旦黑客发现哈希方法,您就可以在一个地方调整密钥生成器功能,然后再次使用安全性进行设置。我只想调整盐和胡椒串。

希望有所帮助。 Chris D. - 来自澳大利亚:)

答案 3 :(得分:0)

对于这些事情,所有类中的CI变量都可以通过自己的库访问:

例如:

$this->session->sess_expiration = 500000;

希望能解决您的问题。

答案 4 :(得分:0)

github上有图书馆,记得我下载它。

使用此库的setCookie()函数,会发生以下情况:

1.生成包含唯一编号的cookie 这个数字记录在一个名为ci_cookies的数据库表中,同时传递给setCookie()的netid / username

2.当调用verifyCookie()函数时,浏览器的cookie散列必须与记录到数据库的散列匹配。如果是,则verifyCookie()在主页

上返回true

答案 5 :(得分:0)

你需要在加载会话之前设置conf

$do_not_remember = (boolean) $this->input->post('do_not_remember');
if ($do_not_remember) {
   $this->config->set_item('sess_expiration', 0);
   $this->config->set_item('sess_expire_on_close', true);
}
$this->load->library('session');