PHP pam_auth和cookies

时间:2010-01-08 21:54:15

标签: php linux authentication ubuntu pam

长话短说,我正在开发一个内部报告引擎。它完全基于Web(利用PHP和各种AJAX技术),并通过我们的生产软件解释存储在MySQL数据库中的数据。它在Ubuntu 8.04服务器上运行,所有员工在该机器上都有一个linux用户帐户。我使用pam_auth设置了一个登录系统,强制用户使用他们的linux用户帐户登录,并确定他们是否属于适当的组以访问特定报告。

这部分效果很好,我的问题是使用cookies添加“记住我”功能。我希望用户有一个30天的cookie只是为了节省他们一些时间和加重每次会话到期时必须登录。我写了代码的“记住我”部分,它存储cookie就好了。我只存储他们的用户名和密码的md5哈希值。当需要重新验证它们时,问题出现了。通常我只是通过比较存储的用户名和数据库中该用户的密码哈希来做到这一点。使事情复杂化的是我无法直接访问用户名和密码哈希值。它们都存储在/ etc / passwd和/ etc / shadow中,登录由PAM模块处理。 pam_auth需要纯文本用户名和纯文本密码。

似乎我唯一的选择是将密码存储为纯文本,还是使用可逆加密,但我并不特别喜欢这两种想法。

这里有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以使用的另一个选项是PHP的内置会话管理。然后,需要在用户计算机上设置的唯一cookie是PHP将自动为您执行的会话ID。

您可以通过更改以下两个ini设置将PHP会话长度设置为至少30天:'session.cookie_lifetime'和'session.gc_maxlifetime'。然后,一旦用户登录,您可以存储他们的用户名,并在调用session_start()后登录$ _SESSION超级全局数组。当用户返回时,您可以检查$ _SESSION数组中的值,以查看他们是否已登录以及是否少于30天。

现在,如果由于其他原因此时仍需要PAM身份验证,则必须将其密码以明文或可逆加密方式存储在会话变量中。虽然这不是理想的,但它比用户浏览器中的cookie更安全。有关更多信息,请查看PHP Session - Manual