0

在我基于 spring-maven-jpa 的 Web 应用程序中,一些数据必须在存储到数据库之前进行加密,然后在从数据库中汇集时解密回来。

所以我创建了我的加密服务,现在我想知道什么应该是最好的实现。

从 OO POV 来看,我认为每个实体都应该知道自己保护和不保护自己。这导致我将我的加密器注入到一个抽象的基础实体中:

public abstract class BaseEntity {

    @Autowired(required = true)
    protected SecurityProvider securityService;

    public BaseEntity() {
    }

    /**
     * secure the entity (if required) using the securityService
     */
    @PrePersist
    @PreUpdate
    protected abstract void secure();

    /**
     * un-secure the entity (if required) using the securityService
     */
    @PostLoad
    protected abstract void unsecure();

    /*--- Getters & Setters ---*/

    public SecurityProvider getSecurityService() {
    return securityService;
    }

    public void setSecurityService(SecurityProvider securityService) {
    this.securityService = securityService;
    }
} 

如您所见,我试图通过@PrePersist、@PreUpdate 和@PostLoad 回调来实现这一点。

目前我在注入加密器时遇到了一些问题,所以我看不到一路测试。

问题是 - 它看起来像一个好习惯吗?你能提出改进或更好的方法吗?

更新:

在运行了一些测试之后,看起来@PrePersist 和@PreUpdate 注释工作得很好,每个实体在写入数据库之前就被加密了。但是@PostLoad 似乎没有像我预期的那样工作。我认为每次我从数据库中汇集一个实体时它都会运行,但由于某种原因该方法没有被调用。我对@PostLoad 的想法有误吗?

4

1 回答 1

1

“命令”设计模式非常适合这一点。基本上,您将拥有一个名为“SecurityClass”的类,其中包含加密和解密方法。

它采用“实体”类型的参数并对它们执行某种类型的加密。使用命令设计模式的优点是任何实体类型的对象都可以被加密,并且不需要继承!

也就是说,使用继承使方法成为 Entity 类的一部分是可以的,但是根据“责任驱动设计”的概念,加密本身是实体的工作,还是某种外部代理的工作?

您可能无法为您的解决方案找到明确的答案,因为它本质上是与数学真理相反的建模。我个人认为你的方式更容易理解,但在你的代码中实现设计模式总是一个好主意。

于 2012-12-02T16:11:53.013 回答