Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在web应用程序中检查用户是否登录?_Php_Authentication_Session_Codeigniter_Cookies - Fatal编程技术网

Php 如何在web应用程序中检查用户是否登录?

Php 如何在web应用程序中检查用户是否登录?,php,authentication,session,codeigniter,cookies,Php,Authentication,Session,Codeigniter,Cookies,我想了解web应用程序身份验证的全部细节。因此,我决定从头开始编写CodeIgniter身份验证库。现在,我必须做出关于如何确定一个用户是否登录的设计决策 基本上,在用户输入用户名和密码对之后。已为此会话设置cookie,web应用程序中的以下导航将不需要用户名和密码。服务器端将检查会话cookie是否有效,以确定当前用户是否登录。问题是:如何确定cookie是否是从服务器端发出的有效cookie 我可以想象最简单的方法是将cookie值也存储在会话状态中。对于每个HTTP请求,比较来自cook

我想了解web应用程序身份验证的全部细节。因此,我决定从头开始编写CodeIgniter身份验证库。现在,我必须做出关于如何确定一个用户是否登录的设计决策

基本上,在用户输入用户名和密码对之后。已为此会话设置cookie,web应用程序中的以下导航将不需要用户名和密码。服务器端将检查会话cookie是否有效,以确定当前用户是否登录。问题是:如何确定cookie是否是从服务器端发出的有效cookie

我可以想象最简单的方法是将cookie值也存储在会话状态中。对于每个HTTP请求,比较来自cookie的值和来自服务器会话的值。(因为CodeIgniter会话库将会话变量存储在Cookie中,如果没有一些调整,它将不适用。)此方法需要存储在服务器端

用于部署在多个数据中心的大型web应用程序。用户在一个数据中心浏览时可能输入用户名和密码,而他/她稍后在另一个数据中心访问web应用程序。预期的行为是用户只需输入用户名和密码一次。因此,所有数据中心都应该能够访问会话状态。即使会话状态存储在外部存储器(如数据库)中,这也可能不适用

我试过谷歌。我用亚洲代理登录谷歌,该代理应该可以指引我到亚洲的数据中心。然后我切换到北美代理,该代理将引导我到北美的数据中心。它可以识别我的登录名,而无需再次询问用户名和密码

那么,有没有办法确定用户是否在没有服务器端会话状态的情况下登录?

没有,这是不可能的。
这些数据中心不是相互隔离的,而是相互连接的。
它是分布式但坚固的“数据库等外部存储”

跨域授权是另一回事,但也很容易实现

这样的信息有什么用呢?仅仅是用户登录的事实,没有任何用户选项、凭据,还有什么用呢?为什么服务器端没有数据库?

有用的资源:

  • 允许您使用自己的机制(例如连接到外部数据库)替换PHP基于文件的会话处理

  • 处理mySQL复制

这只是使用PHP解决方案使用多服务器时出现的众多问题之一——我相信在SO的搜索中会有更多关于这个主题的内容


也可以考虑服务器故障。假设用户被验证为<强> > <>强>,因为存在看起来像会话cookie的东西是一个很坏的想法。另外,如果您不首先调用session_start(),就开始尝试度量有关会话的事实,那么代码将变得非常混乱。更好的解决方案是在会话itelf中存储用户经过身份验证的事实(以及可能的一些授权信息),例如

 session_start();
 if (!$_SESSION['auth_user']) {
    if ($_POST['username'] && $_POST['password'] 
       && check_valid($_POST['username'],$_POST['password']) {
          $_SESSION['auth_user']=$_POST['username'];
       } else {
          // user is not logged in
          header('Location: /login.php');
          print 'You are not logged in';
          exit;
       }
 }
C

那么,有没有办法确定用户是否在没有服务器端会话状态的情况下登录


是的,有。服务器应使用加密的用户ID(可能还有其他数据)设置cookie。如果所有服务器共享该密钥,那么它们也知道如何解密该cookie,从而可以独立地对用户进行身份验证。如果cookie还包含未加密的用户ID,那么您可以使用自定义单向加密函数(也称为salt或hash)来检查它是否有效。如果你真的关心安全,你可以加密更多的数据,例如IP地址、有效期等。如果你愿意,你还可以使用非对称加密,使用公钥和私钥,和/或数字签名。

你的意思是谷歌将为所有数据中心提供一个全球可访问的会话存储?服务器端一般会检查用户是否登录;并决定是继续用户操作还是重定向到登录页面。在现实生活中,我想用户选项也会加载到会话中。@Morgan好吧,这决定了用户已经登录。下一步是什么?“会话”是什么意思?它不是同样的全局数据库吗?我想登录用户的会话数据通常会包含每个会话的信息(例如登录时间)和一些常用信息(例如用户偏好)。这些信息也应该可以在全球范围内访问。@摩根:无论如何,你必须拥有全球存储。那问题是什么?现在没问题了。最初,我想知道是否可能纯粹用cookie验证用户登录。现在我意识到这是不适用和不可行的。谢谢。在饼干上签名就够了吗?