Java 我应该将spring/spring security中的用户ID密钥存储在webapp的何处?

Java 我应该将spring/spring security中的用户ID密钥存储在webapp的何处?,java,spring,session,spring-security,Java,Spring,Session,Spring Security,一旦用户通过身份验证,我就有了一个对象userID 使用Spring Security(这是一个Web应用程序)在春季存储此内容的“最佳”位置在哪里 会话似乎不美观,因为我有两个位置来管理身份验证(我需要特殊代码来管理在用户出于任何原因注销时删除sesion对象) currentContext.GetAuthentication().getDetails(…)看起来很复杂,因为它似乎为每个请求生成details对象 有很多选择,但最好的似乎是接近Spring安全身份验证机制的地方。我相信这在

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

使用Spring Security(这是一个Web应用程序)在春季存储此内容的“最佳”位置在哪里

  • 会话似乎不美观,因为我有两个位置来管理身份验证(我需要特殊代码来管理在用户出于任何原因注销时删除sesion对象)
  • currentContext.GetAuthentication().getDetails(…)看起来很复杂,因为它似乎为每个请求生成details对象

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

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

例如:如果您需要深入业务服务层的用户ID,并且业务服务器层实现到目前为止对web应用程序内容(会话,…)一无所知,那么明智的做法是不要使用HttpSession,以保持它“无web内容”

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

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

我不确定这个问题。你不必储存它。获得它的方法有多种

  • SecurtiryContextHolder,如果需要UserDetails对象
  • 如果只需要loginId,请请求.getRemoteUser()

  • 我想访问控制器中的userID对象,然后将其作为参数传递给服务。SecurityContextHolder将其与身份验证机制保持耦合似乎是合乎逻辑的,但我看到没有简单的方法可以做到这一点。会话不是很好,因为我必须编写代码在登录/注销时更新会话。我只是想知道是否存在另一种人们常用的方法。我的许多服务方法都需要它作为在数据库中查找给定用户数据的密钥。@Czar:
    @Scope(value=WebApplicationContext.Scope\u SESSION,proxyMode=ScopedProxyMode.TARGET\u CLASS)
    -SecurityContextHolder只允许您返回字符串用户名,而不是任意对象。我最终扩展了身份验证机制,以便返回我自己的自定义身份验证对象,该对象支持将任意对象添加到映射,从而允许我附加必要的额外对象,并使其与整个身份验证过程紧密耦合。您是否愿意为您的解决方案提供一些代码或更多详细信息?