【问题标题】:How to reload Spring Security Principal after updating in Hibernate?在 Hibernate 中更新后如何重新加载 Spring Security Principal?
【发布时间】:2011-12-14 22:27:54
【问题描述】:

这一定是一个普遍的问题......我觉得在谷歌搜索之后,我一定是没有彻底四处寻找答案,或者没有人问过它......所以请原谅我。

我正在使用 Spring Security 和 Hibernate 等。

因此,用户/负责人已登录并对其个人资料进行了一些更改。

我使用我的 DAO 更新个人资料 (UserDetails),我希望我的 Principal 自动反映此更新。

但是,当我再次获得 Principal 时,我获得了脏版本(从我的初始登录开始)。

有谁知道我如何让 Spring Security 从 Hibernate 重新加载更新后的 UserDetails?

【问题讨论】:

  • 好的,我发现了一些对我有帮助的东西stackoverflow.com/questions/2398224/… 获取提供程序管理器允许我重新进行身份验证。现在的问题似乎是新的 Principal 已经初始化了所有外围引用,导致它进一步抛出异常
  • 这实际上更像是一个 Hibernate / ORM 策略问题,而不是 Spring Security 问题……对吧?
  • 是的,我对其进行了更多研究,出于安全原因,Spring Sec 似乎使 UserDetails 不受影响。因此,最佳做法是通过强制用户重新输入密码来重新登录用户详细信息。

标签: hibernate spring-security hibernate-generic-dao


【解决方案1】:

我有同样的问题

我通过从 SecurityContextHolder 获取身份验证将其主体转换为用户然后更新主体来修复它。

一切正常,但我不知道这是不是一个好习惯。

【讨论】:

    【解决方案2】:

    OK 挖了一圈,终于找到答案了。

    我们可以创建一个 UsernamePasswordAuthenticationToken 并将更新后的 Principal 分配给上下文。

    Authentication authentication = new UsernamePasswordAuthenticationToken(userObject, userObject.getPassword(), userObject.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(authentication);
    

    另见“How to manually set an authenticated user in Spring Security / SpringMVC”。

    【讨论】:

    • 您的解决方案有效。但是,我会使用PreAuthenticatedAuthenticationToken 而不是UsernamePasswordAuthenticationToken。这基本上做同样的事情 - 它只是有助于澄清你的意图并提高你的代码的可读性
    • 这是在更新身份验证对象中的权限,但不是在原则上。知道如何更新主体吗?
    • 我的userObject.getPassword() 为空(出于安全原因,我们无法获取密码),有什么方法可以在没有密码的情况下完成?
    猜你喜欢
    • 2012-04-12
    • 2012-01-30
    • 2014-04-14
    • 2021-10-20
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多