【问题标题】:How to validate user session on every page如何验证每个页面上的用户会话
【发布时间】:2012-02-09 22:59:10
【问题描述】:

我正在 Codeigniter 中处理这个项目,我创建了登录和注册脚本,但我不知道如何在每个页面上验证用户。 当用户登录到会话中存储哪些数据(Ci session user_data)时,我可以将它与每个页面上的数据库进行比较,以确定会话是否有效? 我正在使用 codeigniter 的会话类,并将值自动存储在数据库中。请帮帮我,我被困在这里...

我的会话是这样处理的:
1。当任何用户访问我的网页时,他都会获得唯一的哈希 (md5) 会话 ID,该 ID 在加载页面时会被检查。如果它存在,如果它不生成新的,则什么也不做。它每 5 分钟更换一次。
2. 当用户登录要传递的数据时,我可以稍后将其与数据库进行比较(在每次页面加载时)

我不知道只存储 'is_logged' = 1 cookie 是否安全。我想检查每个服务器请求的 cookie。

【问题讨论】:

  • 请注意,在每次页面加载时查询数据库都会对性能造成重大影响。根据您的需要,这可能是合理的,但需要考虑。

标签: php codeigniter session login


【解决方案1】:

会话存储在服务器上,因此不需要验证。您只需要验证您在会话中放入的内容。

会话由提供 session_id cookie (PHPSESSID) 的用户进行身份验证。

另一方面,Cookie 确实需要验证,但 Cookie 不应该用于存储关键数据,所以它有点没有实际意义。

【讨论】:

  • CI 的会话是加密的 cookie,而不是原生 php $_SESSION 数组,OP 说他使用的是 CI 的会话库
  • 是的..他编辑了他的问题。我的回答适用于 PHP 的原生会话处理。
【解决方案2】:

成功登录后,您将创建一个

$this->session->set_userdata(array('authorized' => true));

然后,您可以创建一个身份验证库或模型方法,只要检查此会话数据是否存在即可。

function is_logged()
{
  return (bool)$this->session->userdata('authorized');
}

如果为 FALSE,则用户未登录,如果为 TRUE,则为。您可以在需要放置在身份验证后面的每个控制器方法上调用此函数,或者如果所有方法(例如管理面板)都需要它,则可以在控制器的构造函数中调用此函数

例如,看看 Ion Auth(CI 中的主流 Auth 库之一)如何处理这件事(使用与我的示例代码相同的 logged_in() 方法。请记住,会话被加密,如果存储在数据库中,安全性更高); https://github.com/benedmunds/CodeIgniter-Ion-Auth/blob/2/libraries/Ion_auth.php

【讨论】:

  • 理论上如果本地用户修改了他的cookies并设置'authorized' = true,即使他没有登录,他也能登录吗?本地cookie也可以修改吗?
  • cookies是加密的,操作应该没那么简单。此外,您将会话存储在数据库中,因此不涉及 cookie
  • 所以可以说我有一个 auth() 方法充当 __construct 类,在调用任何其他方法之前检查会话。我是否应该检查数据库以确定用户是否已登录(授权 = 1)或 cookie?你也能更清楚地解释你的第二句话吗?谢谢
  • 好的,总结一下: 1. 在会话表中,我有用户的 cookie。 2. 当用户打开一个页面时,我检查他的 cookie 与会话表中的 cookie 3. 如果 session_id 是匹配的并且他是 logged_in = 1(在 cookie 和表中),那么他还好吗?
  • 如果设置使用数据库,使用普通方法调用,CI会自动检查数据库,无需手动查询。基本上,是的,工作流程是这样的。如果您需要更多方法或灵感来源,请查看经过长期测试的代码:Ion Auth 或 Tank Auth,例如,2 个最常用(我现在编造的统计数据)CI 的授权库。你可以看到他是如何处理工作的,就像我指出的那样
【解决方案3】:

你应该在助手中编写一个函数,比如 session_helper。在你的类的构造函数中调用这个助手方法。如果你的用户正确登录,那么它将继续,否则它将重定向到登录页面。你的助手应该像这样

   function session_set()
   {
$ch=&get_instance();
if($ch->session->userdata('your_session_id')=='')
{
    redirect('your_login_page');

}   

在控制器中你应该像这样检查(构造函数)

   session_set();

希望这对你有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2013-07-11
    • 2019-09-10
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多