代码之家  ›  专栏  ›  技术社区  ›  Jordan Davis

管理会话变量的方法

  •  8
  • Jordan Davis  · 技术社区  · 10 年前

    最近几天,我一直在阅读(mysql)触发器……具体来说,我想做的是找出一种更新用户信息的好方法。


    这种情况的使用与用户管理系统有关: 以a为例 admin 用户更新 regular 用户到 manager ,此用户 type 那么变化就会 enable|disable 界面上的软件功能。

    问题: 你不会知道这个用户 类型 更改,除非您查询数据库并重置,例如 $_SESSION['user']['type'] 变量,或用户从系统登录。


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

    8 回复  |  直到 10 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

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

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

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

    • 如果您的角色 逻辑很复杂 它由分配给一个用户的多个角色以及每个用户的额外权限分配/排除组成,最好进行此检查 用户登录一次 然后使用session记住结果。
    • 如果 检查权限 每次脚本运行时 不是问题 ,你可以 去做吧 但请注意,出于安全原因,强制用户再次登录可能是一种好做法。
    • 如果用户 注销 可能导致 失去工作 ,你应该 让用户注销 自身并在下次登录后应用新权限(您可以向用户显示一条消息,说明新权限正在等待登录生效)。

    所以,这实际上取决于您的需要,选择是注销用户、立即授予他新权限还是等到下次登录。

        2
  •  2
  •   Paul Spiegel    10 年前

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

    找个好理由不去做!

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

    • 该功能的价值是什么?
    • 值得吗 头痛 费用
    • 该功能有哪些风险(工作不完整/系统一致性)?
    • 你必须改变系统核心吗?
    • 您需要重新验证系统吗?
    • 还有其他真正伟大的功能(系统改进)有待实现吗?

    回答这些问题时感到不自在的人其实并不需要这个功能。

    寻找简单的替代方案:

    • 呼叫用户并要求注销。
    • 通过电子邮件通知用户。
    • 提供电子邮件通知按钮。
    • 更改权限后自动发送电子邮件通知。

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

        3
  •  1
  •   Felippe Duarte    10 年前

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

        4
  •  1
  •   Anirudha Kasralikar    10 年前

    我认为将会话存储到缓存机制(如Redis)中会给您带来额外的优势。它比在数据库中存储会话数据轻。您可以非常轻松地创建簇。点击 here 以查看示例实现。

    因此,一旦用户“类型”更改,您就可以加载redis数据缓存并根据自己的意愿进行更新。

        5
  •  0
  •   Daniel Patrick    10 年前

    我认为这样做最安全,我会选择“头痛”的方式。

    1. “普通”用户A登录并打开会话A1。
    2. “admin”用户将A升级为“manager”。
    3. 目前,会话A1是有效的会话,但它不会授予用户“管理员”权限。
    4. 当用户A注销并重新登录会话A2时,该会话现在将授予用户“管理器”的所有权限,并从数据库中查找当前“类型”。

    根据您的应用,替代方案可能稍贵:

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


    添加另一个备选方案:

    不要使用MYSQL触发器,当应用程序调用者(管理员)更新用户a的“类型”时,它还会调用缓存会话的任何位置,并且(a)更新会话(不推荐*)或(b)使会话无效并强制用户再次登录。


    *请注意,所有这些解决方案都要求用户在拥有新的“管理者”权限后重新输入其凭据,然后才能访问“管理者资料”。我认为这比在没有任何身份验证的情况下更新会话更安全。

        6
  •  0
  •   Webeng    10 年前

    我建议的方法是存储 type 数据库中每个用户的。如果您决定存储 类型 作为会话变量(除其他变量外):

    1. 会话到期后,此信息将丢失。通常会话持续30分钟,但您可以将其修改为任意长度。但是,如果您创建的会话持续1个月,那么任何有权访问该用户计算机的人都将登录到用户帐户 无需使用任何密码 .

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

    关于您对信息更新后访问数据库的担忧,我不会说这些信息像您可能认为的那样令人担忧。让我们想象一下以下示例:

    1)

    例如,如果用户是 经理 目前,他正在加载一个网站,在那里他可以做强有力的行动,然后他被降级为 典型的 用户,那么在数据库中保存这些信息将非常有效。如果用户试图使用他的权力(不再是他的权力),他会单击一个按钮,向数据库发送一个请求以确认他的权力 类型 。数据库查询速度非常快,因此速度不是问题。我更关心的是从会话变量中获取信息的速度,而不是从数据库中获取信息。

    2)

    如果用户在访问页面时 典型的 用户,而在页面上,他变成了 经理 这样,他就可以在刷新页面后行使他的权力。我的意思是,如果您使用会话,并且希望页面自动获取信息,比如 AJAX 然后更新页面上的选项,这将比简单的刷新消耗更多的服务器电量。

    给一个简单的 SELECT * FROM myTable WHERE id = 4 在数据库上执行可能只需要1毫秒。数据库是专门为其速度而设计的,这也是为什么它们更受欢迎的原因

    然而 ,也许您没有访问数据库的权限,这就是为什么您要搜索其他选项?你真幸运! 我的SQL 是仅使用文件存储信息的数据库。它是专门为没有太多资源的用户设计的,具有MySQL应有的许多功能。

        7
  •  0
  •   user2560539 user2560539    10 年前

    因为每个用户都有一个 role type 这意味着在应用程序中查看或编辑内容的能力与此因素密切相关。这意味着会话变量应该具备的两个基本要素是 userID userType 也应该存储在数据库中

    这些信息可以传递给 $_SESSION['user'] 例如,作为一个小数组,其中数组键可以是 用户ID 用户类型 值。

    $_SESSION['user']=array($userID => $userType);
    

    用户登录后,您的初始值将存储到 session 。为了您的申请 知道 什么 userA 可以在应用程序中查看或编辑,基本上可以在脚本中与 用户类型 那个 用户A 有但要实现您想要的,您基本上需要在每个 VIEW/PAGE 您的应用程序。如果是新的 用户类型 已分配给 用户A 只需显示一条消息,他/她将在15秒钟内自动注销(留出时间阅读消息本身),以便更改生效。当您的用户看到此消息时,您将获取他/她可能拥有的当前会话数据并将其保存在数据库中,因为某些会话变量可能在 用户类型 。通过放置 用户类型 在每个开始 视图/页面 您可以避免用户可能丢失数据的麻烦。

        8
  •  -1
  •   Rosh Donniet    10 年前

    如果脚本使用 $_SESSION['user']['type'] 要了解用户的权限,我只需更改其值。 或者也许我不了解这个问题?