Spring security 使用Spring Security/MVC 3.1重构UserObject的最佳实践

Spring security 使用Spring Security/MVC 3.1重构UserObject的最佳实践,spring-security,implementation,Spring Security,Implementation,在SpringSecurity/MVC之前,我在会话中存储了一个简单的相对不安全的userobject,它保存了大量数据,我会在服务逻辑中进行更新,然后在每次修改后存储回会话中 现在,我已经成功地将userobject锁定为具有相同复杂数据结构的主体对象。与之前一样,在使用存储在其中的初始状态进行身份验证后,userObject对视图可用,但是实现UserDetails的我的userObject现在似乎不可更改(在每个请求上都不创建新的身份验证对象)。当然,它不能像我在会话中所做的那样,被隐藏回

在SpringSecurity/MVC之前,我在会话中存储了一个简单的相对不安全的userobject,它保存了大量数据,我会在服务逻辑中进行更新,然后在每次修改后存储回会话中

现在,我已经成功地将userobject锁定为具有相同复杂数据结构的主体对象。与之前一样,在使用存储在其中的初始状态进行身份验证后,userObject对视图可用,但是实现UserDetails的我的userObject现在似乎不可更改(在每个请求上都不创建新的身份验证对象)。当然,它不能像我在会话中所做的那样,被隐藏回修改过的SecurityContext中

所以我想我要么需要:

A.重新构造我的UserObject以获取所有其他内容,并在使用自定义筛选器进行身份验证后将其添加到会话中

B.每次更改后创建一个新的身份验证对象(听起来非常昂贵…)

C.其他一些我还没有看到或理解的东西


我检查了许多答案,这似乎是一个常见的问题,但没有一个解决我的具体问题。我是不是遗漏了一些很明显的东西?

我不认为你遗漏了什么。UserDetails对象的目的是使其不可变。它应该由UserDetailsService加载,作为身份验证过程的一部分


我会投票赞成:重新构造你的用户对象,并尽可能少地在会话中使用它。实际上,用户对象应该只存储与您的应用程序相关的权限,以及可能不会有太大变化的用户属性(名称、标题等),并且仅当应用程序出于显示或处理目的需要这些权限时。它不应该存储用户使用应用程序时积累的数据(跟踪习惯、点击等)。应该存储在其他地方,例如数据库中。

如果可以避免,请不要在会话中存储数据。您的客户机-服务器关系应该是无状态的。如果您必须这样做,就像在Spring安全中一样,请尽可能使您的UserDetails对象变轻。除了安全凭据之外,无状态。客户端不应该将每个请求的安全凭据都传递给服务器(至少在许多情况下是这样)。Jonathan我很感激响应,但是我如何既能从UserDetails对象中取出这些内容,又能在会话中不使用它们呢?如果每次进行更改时都从db new获得这些东西,那听起来就像创建一个新的身份验证对象来存储对UserDetails的每次更改一样昂贵。我很可能需要优化我的数据策略。正在变化的数据的性质是什么?这是您正在更改的每用户数据,还是应用程序范围内的数据,以及缓存策略更好地服务的数据?请记住,会话数据是有状态数据,因此如果您在群集环境中工作,您对会话对象所做的每一次更改都必须能够故障转移到集群的任何其他成员。。。这通常意味着不考虑数据库写入。将能够做到这一点的需求乘以系统上会话未超时或未显式使会话无效的用户数,您可能会猜到会话中任何类型的重要数据都会导致可伸缩性问题的原因。数据是一个具有无限多个节点和分支的树。当前,用户可以关闭/打开分支、将节点/分支拖放到其他节点/分支、在位编辑节点等。。。因此树肯定是“有状态的”。ajax为底层obj/db处理这些事件。我知道最终我需要延迟加载树并限制返回的节点数。我没有想到需要将用户对象拆分为不可变和可变(用户和树似乎是逻辑的)组件。哈,即使在我写这篇文章的时候,我看到了答案,我想我已经被我目前的方法束缚住了。