Ruby on rails 如何记住用户登录的组织?在组织之间切换

Ruby on rails 如何记住用户登录的组织?在组织之间切换,ruby-on-rails,ruby,session,ruby-on-rails-4,authentication,Ruby On Rails,Ruby,Session,Ruby On Rails 4,Authentication,背景: 用户和组织通过关系建立了多对多关系。因此,一个用户可以是多个组织的一部分 但用户只能为1个组织登录 因此,用户有一个屏幕,可以在他所属的组织之间切换 另外,user有一个默认组织,即用户最初登录的组织。这是使用具有一到关系来实现的 如何知道/记住用户当前登录的组织? 现在我有点纠结于如何实现应用程序应该如何知道/记住用户当前登录的组织。我看到了三种选择,并希望得到最有效的建议: 用户数据库中的一个附加列,用于存储用户当前登录的组织(或关系?)的id。然后,的助手方法logged\u

背景:

  • 用户
    组织
    通过
    关系
    建立了
    多对多
    关系。因此,一个用户可以是多个组织的一部分
  • 但用户只能为1个组织登录
  • 因此,用户有一个屏幕,可以在他所属的组织之间切换
  • 另外,
    user
    有一个默认组织,即用户最初登录的组织。这是使用
    具有一到
    关系来实现的
如何知道/记住用户当前登录的组织?

现在我有点纠结于如何实现应用程序应该如何知道/记住用户当前登录的组织。我看到了三种选择,并希望得到最有效的建议:

  • 用户
    数据库中的一个附加列,用于存储用户当前登录的
    组织
    (或
    关系
    ?)的id。然后,
    的助手方法
    logged\u in\u可以根据该列中的值找到组织,并返回用户登录的组织。使用db列的实现还支持验证,这样用户就不能将其登录的组织设置为它甚至不属于的组织
  • 使用定义/设置用户当前登录的组织的cookie
    会话[:logged\u in\u for]
    。但是,1)我怀疑这是否安全(不确定为什么),2)我认为第一个选项更便于验证,3)我也不认为这与登录“记住我”选项结合使用会起作用
  • 实施一个附加
    关系,该关系定义用户登录的组织。这基本上是添加关系的第一个选项的扩展。因为我已经有很多关系了,所以我不喜欢这个选择。或者,对于第一个选项,没有办法绕过此添加

  • 第一个选项是否确实是了解/记住用户当前登录的组织的有效方法?

    您可以将信息存储在中,但不使用cookie store,而是使用

    您可以将信息存储在中,但不使用cookie store,使用

    它实际上取决于您希望为最终用户创建的体验。在您的情况下:

  • 这将允许记住登录之间的组织,在您的应用程序中,这可能是有用的或完全没有意义的。如果记住一个组织确实有用(即,用户在登录后选择组织的后勤是不频繁的),那么这可以创造更好的用户体验

  • 会话
    是安全的,您可以像散列一样使用它,它不会与应用程序中的其他功能冲突(除非您使用相同的密钥)。这种情况适用于您的应用程序,因为用户应该在登录后始终选择一个组织,因此它应该是基于会话的

  • 参考:

  • 正如你提到的,这是不理想的,你已经知道了

  • 这实际上取决于您希望为最终用户创建的体验。在您的情况下:

  • 这将允许记住登录之间的组织,在您的应用程序中,这可能是有用的或完全没有意义的。如果记住一个组织确实有用(即,用户在登录后选择组织的后勤是不频繁的),那么这可以创造更好的用户体验

  • 会话
    是安全的,您可以像散列一样使用它,它不会与应用程序中的其他功能冲突(除非您使用相同的密钥)。这种情况适用于您的应用程序,因为用户应该在登录后始终选择一个组织,因此它应该是基于会话的

  • 参考:

  • 正如你提到的,这是不理想的,你已经知道了

  • 谢谢,听起来像是
    session
    是一个不错的选择。在以下用例中,
    会话
    会发生什么:1)用户登录时选中“记住我”;2)
    会话[:登录]
    哈希设置;3) 用户在登录时关闭浏览器;4) 用户再次打开浏览器和网站,由于“记住我”选项,不需要登录。那么
    session[:logged_in_for]
    会不会是
    nil
    ,因为这会在关闭浏览器时被破坏?1)
    session
    不会受到影响,因为“记住我”选项将使用cookie(具体实现方式会有所不同);2) 只要浏览器会话处于活动状态,您就可以访问
    会话[:登录]
    ;3)
    会话
    将被删除,但
    cookies
    将持续存在,如果选择了“记住我”,则允许用户在不登录的情况下返回;4) 您是正确的,
    会话[:logged\u in\u for]
    将为零。现在,这取决于您希望为用户记住组织的程度。您可以使用
    cookies
    作为机器相关的,跨机器存储在数据库中。但是,请记住,
    cookies
    是不安全的。谢谢,听起来像是
    session
    才是正确的选择。在以下用例中,
    会话
    会发生什么:1)用户登录时选中“记住我”;2)
    会话[:登录]
    哈希设置;3) 用户在登录时关闭浏览器;4) 用户再次打开浏览器和网站,由于“记住我”选项,不需要登录。那么
    session[:logged_in_for]
    会不会是
    nil
    ,因为这会在关闭浏览器时被破坏?1)
    session
    不会受到影响,因为“记住我”选项将使用cookie(具体实现方式会有所不同);2) 您将有权访问
    会话[:登录\u_