【问题标题】:Where should I store a user ID key in spring / spring-security in a webapp?我应该在 web 应用程序的 spring/spring-security 中将用户 ID 密钥存储在哪里?
【发布时间】:2011-05-16 00:49:39
【问题描述】:

一旦用户通过身份验证,我就有一个对象用户 ID。

使用 Spring-Security(这是一个 web 应用程序)在 Spring 中存储它的“最佳”位置在哪里?

  • Session 似乎不优雅,因为那时我有两个位置管理身份验证(我需要特殊代码来管理在用户出于任何原因注销时删除会话对象)
  • currentContext.getAutentication().getDetails(...) 看起来很复杂,因为它似乎会根据请求生成详细信息对象

有很多选择,但最好的似乎是接近 Spring-Security 身份验证机制的地方。

【问题讨论】:

    标签: java spring session spring-security


    【解决方案1】:

    我不确定这个问题。您不必存储它。有多种获取方式。

    1. SecurtiryContextHolder 如果您需要 UserDetails 对象
    2. request.getRemoteUser() 如果您只需要 loginId

    【讨论】:

    • SecurityContextHolder 只允许您返回字符串用户名,而不是任意对象。我最终扩展了身份验证机制,以便返回我自己的自定义身份验证对象,该对象支持将任意对象添加到地图中,允许我添加必要的额外对象并将其与整个身份验证过程紧密耦合。
    • 您愿意提供有关您的解决方案的一些代码或更多详细信息吗?
    【解决方案2】:

    我不相信会为每个请求创建身份验证详细信息。我相信它们每次身份验证都会创建一次。

    【讨论】:

      【解决方案3】:

      我相信这在很大程度上取决于您使用用户 ID 的方式。

      例如:如果您在业务服务层深处需要 userID,并且业务服务器层到目前为止对 Web 应用程序(会话,...)一无所知,那么明智的做法是不要使用 HttpSession,使其保持“网络免费”。

      顺便说一句: 您可以考虑的第三种方法是使用会话范围 bean。

      【讨论】:

      • 我想访问控制器中的 userID 对象,从那里我将把它作为参数传递给服务。 SecurityContextHolder 将其与身份验证机制保持耦合似乎是合乎逻辑的,但我看到没有简单的方法可以做到这一点。会话不是很好,因为那时我必须编写代码来更新登录/注销时的会话。我只是想知道是否存在人们使用的另一种常见方法。我的许多服务方法都需要它作为在数据库中为给定用户查找数据的键。
      • @Czar: @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) - static.springsource.org/spring/docs/3.0.x/reference/…
      猜你喜欢
      • 2017-05-30
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多