Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Защита и снятие защиты данных из приложения в БД

Автор вопроса: forhasОтветов: 1

В моем веб-приложении на основе spring-maven-jpa некоторые данные должны быть зашифрованы непосредственно перед сохранением в БД, а затем расшифрованы обратно при объединении из БД.

Итак, я создал свой сервис шифрования, и теперь мне интересно, какой должна быть лучшая реализация.

С точки зрения OO, я думаю, что каждая сущность должна знать, как защищать и не защищать себя. Это приводит меня к внедрению моего шифровальщика в абстрактный базовый объект:

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?

encryptiondatabasesecurityjpa

Ответы

Ответ 1 · рейтинг 1 · christopher

Для этого хорошо подходит шаблон проектирования "Команда". В основном у вас будет класс под названием "SecurityClass" с методами шифрования и дешифрования.

Он принимает параметр типа "сущность" и выполняет для них некоторый тип шифрования. Преимущество использования шаблона проектирования Command заключается в том, что любой объект типа Entity может быть зашифрован, и нет необходимости в наследовании!

Тем не менее, использование наследования для того, чтобы сделать методы частью класса Entity, - это нормально, но в соответствии с концепцией "дизайна, основанного на ответственности", является ли работа сущности заключаться в шифровании самой себя или это больше работа какого-то внешнего агента? ?

Вы можете не найти окончательного ответа для своего решения, потому что оно, по сути, является моделированием, а не математической истиной. Я лично думаю, что ваш способ легче понять, но реализация шаблонов проектирования в вашем коде всегда является хорошей идеей.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы