2014-07-15 90 views
2

在使用任何框架之前,我一直使用来自PHP的$_SESSION来记录登录用户,我想知道是否有其他方法以更优雅的方式完成相同的事情。跟踪登录用户

我看到了an answer在看起来有趣的计算器上。

我听说过一些所谓的代币(我的理解是一个字符串),我注意到它的URL,但我想知道:

  1. 什么是令牌的目的是什么?
  2. 如何生成它?
  3. 当用户注销时,我必须在数据库中更新它吗?
  4. 使用令牌创建cookie并检查它是否是一种很好的做法?

据我所知,用户可以限制正在创建的Cookie。

...我想知道是否(例如使用ZF2)我想限制某些页面上的用户访问,如果他没有登录。我想我可以封装在服务类的逻辑。什么似乎相当多余的是,在每个模块中,我想要使用服务,我将不得不做一个像isUserLoggedIn()这样的检查,并决定要做什么 (如果没有登录可能会重定向到登录页面),这似乎不是很干。

回答

2

首先:为了把密码的令牌的URL(GET方法)是你可以做的最糟糕的事情。

如果其他人知道该URL(例如,当用户共享链接或当本地网络中的某人扫描请求时),他将自动登录而不知道登录凭证。如果您使用HTTPS,将其作为POST发送会增加安全性。

但是一般:是 - 一个标记基本上只是一个随机字符串。因此生成令牌非常简单 - 您只需确保它们是唯一的。

随着你的想法将登录令牌保存为cookie,你正处于正确的轨道上但是:这正是SESSION所做的。会话是用来标识用户的令牌。

您提到的帖子基本上是对此的补充。 Sessions自然不会做任何其他保存与用户相关的信息(或者更具体地说:他的会话ID)。在帖子中,他们通过添加超时(XX秒后自动注销)和轮询策略(用户需要确认他每隔X秒还活着 - 否则他将被注销)为基于会话的授权手动添加功能。

当然,您还可以在数据库中保存登录/会话信息。因此,您可以通过这种方式手动保存令牌(这是$ _SESSION中的session ID)和相关信息。但是默认情况下,PHP自己处理$ SESSION的“保存” - 如您所见,here。所以,如果不需要创建自己的会话处理,我会建议使用PHP自己的会话。

对于你的ZF2问题我也建议使用ACL。如果你不想在每个页面上检查权限,你可以尝试扩展路由类或者导入一个简单的“助手”函数,它的功能在上面的文章中有描述。它会从ACL中检查“全局”特权,并为每个页面动态处理它们。所以你不需要为每个想要“锁定”的页面编写代码(只有acl)。

希望这会有所帮助! ;)

+0

这确实有帮助!非常感谢你 ! – user3009269

+0

@ user3009269如果您有进一步的问题,请随时询问;) –