管理会话变量的方法

时间:2016-05-12 11:48:37

标签: php mysql session triggers session-variables

我一直在阅读(mysql)触发过去几天...特别是我想要做的是找出更新用户信息的好方法。

用于此的案例与用户管理系统有关: 例如,admin用户将regular用户更新为manager,此用户type将更改enable|disable界面上的软件功能。

问题: 除非您查询数据库并重置例如type变量,或者用户登录|退出系统,否则您不会知道此用户$_SESSION['user']['type']更改。

问题:有什么好方法可以解决这个问题吗?

7 个答案:

答案 0 :(得分:4)

我不认为mysql triggers would be ideal for this。为什么?因为你最有可能最终得到php中的部分逻辑和mysql中的部分逻辑。使用一种技术是一件好事,因为以后为您和您的同事维护/调试代码会更容易。

因此,在您的情况下,如果您希望更改用户角色将立即执行操作,则必须在每个脚本运行时加载用户角色,或者使用数据库中的某个标志注销用户,这将标志着他的会话不是已经有效(或者您可以实现自己的session_set_save_handler,它可以将文件保存在文件中,您可以将其删除以注销用户)。

这取决于您的需求哪种解决方案更适合您的情况。

  • 如果您的角色逻辑很复杂并且它包含分配给一个用户的多个角色以及每个用户的额外权限分配/排除,那么最好对用户进行一次检查登录,然后使用session记住结果。
  • 如果检查权限在每个脚本运行不是问题,您可以执行。但请注意,出于安全原因,强制用户再次登录可能是一种好习惯。
  • 如果用户退出可能导致丢失工作,则让用户注销本身并在下次登录后应用新权限(您可以向用户显示一条消息,表明新权限正在等待登录才能生效)。

所以这真的取决于你选择是否更好地注销用户,立即给他新的权限或等到下次登录时的需要。

答案 1 :(得分:2)

  

问题:有没有什么好方法可以解决这个问题?

找到不这样做的好理由!

虽然这听起来像个笑话,但我完全认真。你必须考虑:

  • 该功能的价值是什么?
  • 值得头痛费用?
  • 该功能有哪些风险(工作/系统一致性不完整)?
  • 您是否需要更改系统核心?
  • 您是否需要重新验证系统?
  • 还有其他非常棒的功能(系统改进)等待实施吗?

对于回答这些问题感到不自在的人并不是真的需要这个功能。

找到简单的替代方案:

  • 致电用户并要求退出。
  • 每封电子邮件通知用户。
  • 提供电子邮件通知按钮。
  • 更改权限后自动发送电子邮件通知。

这不是懒惰。只关注真正的价值。

答案 2 :(得分:1)

另一种方法是使用一些时间间隔执行ajax请求,以更新用户$ _SESSION。 如果您的'type'中有任何更改,您可以执行任何操作,例如强制用户重新登录您的应用程序,或者只执行更新$ _SESSION信息。 当然,您需要知道在用户注销和下次登录之前是否确实需要获取此信息,并使用更新的配置文件。

答案 3 :(得分:1)

我认为将会话存储到像Redis这样的缓存机制会给你带来额外的好处。它比在数据库中存储会话数据轻。您可以非常轻松地创建群集。点击here查看示例实施。

因此,一旦用户"键入"更改,您可以加载redis数据缓存并根据您的意愿更新它。

答案 4 :(得分:0)

我认为最安全的方法是做到这一点,而我选择的是#34;头疼"方式。

  1. '定期'用户A登录并打开会话A1。
  2. '管理'用户将A升级为'经理'。
  3. 目前,会话A1是一个有效的会话,但它不会授予用户“'经理'特权。
  4. 当用户A注销并重新登录到会话A2时,此会话现在将向用户授予管理员的所有权限,并查找当前的'类型'来自数据库。
  5. 根据您的应用,可能会略微昂贵的替代方案:

    每次用户提供会话令牌时,请使用数据库检查会话的有效性。如果该会话包含无效信息(即'类型'不再匹配),则强制用户重新登录。

    添加另一种选择:

    不要使用MYSQL触发器,当应用程序调用者(管理员)更新用户A'键入时,它也会在您缓存的任何地方拨打电话会话和(a)更新会话(不建议*)或(b)使会话无效并强制用户再次登录。

    *请注意,所有这些解决方案都要求用户在找到新发现的'经理后重新输入凭据。在他们可以访问“经理”之前的权力#39;我认为这比没有任何身份验证更新会话更安全。

答案 5 :(得分:0)

我推荐的方法是将每个用户的type存储在数据库中。如果您决定将type存储为会话变量,则会出现问题(其中包括):

  1. 会话过期后,此信息将丢失。通常会话持续30分钟,但您可以根据需要对其进行修改。但是,如果您创建的会话持续1个月,则有权访问该用户计算机的任何人都将登录到用户帐户,而无需使用任何密码

  2. 您将无法使用数据库提供的强大和高级查询(例如MySQL,例如使用SQL)。如果您将信息存储在会话中,请确保您可以找到一种方法来逐个查找每个用户信息,但为什么要重新发明轮子?从头开始构建数据库结构并不容易,因此我不建议这样做。

  3. 关于您在更新信息后访问数据库的问题,我不会说这些信息与您可能认为的一样令人担忧。让我们想象下面的例子:

    <强> 1)

    如果某个用户当前是经理,并加载了一个他可以执行强大操作的网站,之后他被降级为普通用户,那么在数据库中拥有此信息将完美地工作。如果用户试图使用他的权力(不再是他的权力),他会点击一个按钮,向数据库发送请求以确认他的type。数据库查询非常快,因此速度不是问题。我会更关心从会话变量获取信息所需的速度而不是数据库。

    <强> 2)

    如果用户在正常用户的同时在页面上,并且在页面上他成为经理,那么他将能够行使他的权力刷新页面后。我的意思是,如果您使用了会话,并且您希望页面自动获取信息,例如 AJAX ,然后在页面上更新他的选项,那将比简单刷新消耗更多的服务器功率。 / p>

    给一个简单的SELECT * FROM myTable WHERE id = 4只需要1毫秒就可以在数据库上执行。数据库专门针对它们的速度而设计,这就是它们首选的原因

    ,也许您无法访问数据库,这就是您正在寻找替代方案的原因?好吧,你是幸运的! MySQLi 是一个仅使用文件存储信息的数据库。它专为那些没有太多资源的用户而设计,具有MySQL所具备的许多功能。

答案 6 :(得分:0)

由于每个用户都有zrole,这意味着查看或编辑应用内容的能力与此因素紧密相关。这意味着您的会话变量应具有的typeuserID的两个基本内容也应该存储在您的数据库中

这些信息可以传递给userType,例如作为一个小数组,您的数组键可以是$_SESSION['user']userID值。

userType

用户登录后,您的初始值将存储到$_SESSION['user']=array($userID => $userType); 。为了使您的应用能够了解 session可以在您的应用中查看或修改的内容,您基本上会在脚本中对userA userType进行比较。但要实现您的目标,您基本上需要在应用程序的每个userA开始时重新获取该信息。如果已将新VIEW/PAGE分配给userType,只需显示一条消息,表明他/她将在15秒内自动注销(给予时间阅读邮件本身),以使更改生效。当您的用户看到此消息时,您可以获取他/她可能拥有的当前会话数据并将其保存在数据库中,因为某些会话变量可能(或不可用)升级或降级userA。通过将userType与应用程序的每个userType的开头进行比较,您可以省去用户可能丢失数据的麻烦。