【问题标题】:JPA Repository & Spring Security - updating object makes password invalidJPA Repository & Spring Security - 更新对象使密码无效
【发布时间】:2020-02-08 14:25:34
【问题描述】:

我正在尝试更新我的用户 DTO 的字段,但每次我通过执行 userService.save(user) 进行更新时,我的登录凭据在数据库中变得无效,因为当我第一次获取用户时,我得到了加密我的 DTO 的密码字段中的密码,当我再次保存用户时,我正在重新加密加密的密码,使密码与以前不同。

我该如何解决这个问题?当我第一次在我的用户服务中查询数据库时,我应该解密密码吗?那安全吗?

编辑:发现无论如何您都无法解码密码(我正在使用 BCryptPasswordEncoder)。有没有办法在不影响密码的情况下更新我的所有字段?

【问题讨论】:

    标签: java spring-boot spring-security spring-data-jpa


    【解决方案1】:

    您是否尝试过仅更新列而不保存整个实体? 在 Spring Data JPA 文档中有一个如何创建此类查询的示例:
    https://docs.spring.io/spring-data/jpa/docs/2.1.1.RELEASE/reference/html/#jpa.modifying-queries
    补充:
    如果有办法只保存密码而不重新加密它?如果是这样,您或许可以尝试:
    - 获取加密密码。
    - 更新用户实体(导致加密密码被第二次加密)。
    - 仅用步骤1中获得的加密密码覆盖用户中的密码。

    【讨论】:

    • 问题是我不只是更新一个列。我要更新的字段是多对多关系;这是一组角色。我真的不知道如何在纯 SQL 中做到这一点。
    【解决方案2】:

    您应该使用实体侦听器。

    看这里https://www.concretepage.com/java/jpa/jpa-entitylisteners-example-with-callbacks-prepersist-postpersist-postload-preupdate-postupdate-preremove-postremove

    创建实体监听类,实现preUpdate方法。

    您应该将 applicationContext 注入到类中。你可以找到bean“passwordEncoder”。 Spring 使用它来编码密码。

    在预更新方法中,您获取原始密码,创建编码版本,如 passwordEncoder.encode(password) 并将其设置回实体。

    【讨论】:

      猜你喜欢
      • 2019-03-02
      • 2014-02-14
      • 2015-10-27
      • 2012-01-17
      • 2018-11-05
      • 1970-01-01
      • 2012-04-23
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多