我应该在 web 应用程序的 spring/spring-security 中将用户 ID 密钥存储在哪里?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

    SecurtiryContextHolder 如果您需要 UserDetails 对象 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/…

以上是关于我应该在 web 应用程序的 spring/spring-security 中将用户 ID 密钥存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

spring整合JDBC

69道Spring面试题和答案

使用 Spring Security 5 OAuth2 实现 Keyclock 授权服务器

在 Web 应用程序的压力测试期间记录性能时,我应该在 Windows 性能监视器中使用哪些计数器?

GWT:刷新页面会导致整个 Web 应用程序重新启动。我应该在哪里保存状态?

我应该为 Web 应用程序数据源使用啥 JNDI InitialContext 实现?