2016-12-17 44 views
1

У меня есть класс контейнера, только часть сервлета и уровень доступа к данным - это тот, который взаимодействует с моей базой данных и предоставляет результат для параметров запроса.Как узнать вызов моего класса и методов в java?

У меня есть классы и методы уровня доступа к данным как общедоступные, так что любой может читать содержимое, хранящееся в базе данных, в убеждении, что к нему обращается только правильный человек.

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

Звучит слишком много теории правильно? Вот мой пример фрагмент моего уровня доступа к данным:

DataStore.java

//This is my interface 

public interface DataStore { 

public String[] selectData(query params) throws Exception; 

public String[] addData(query params) throws Exception; 

public String[] editData(query params) throws Exception; 

public String[] deleteData(query params) throws Exception; 

} 

DataStoreImpl.java

//This is my implemetation part of my above interface 

public class DataStoreImpl implements DataStore { 

    public String[] selectData(query params) throws Exception { 

      //Code implementing select query logic 
    } 

    public String[] addData(query params) throws Exception { 

      //Code implementing insert query logic 
    } 

    public String[] editData(query params) throws Exception { 

      //Code implementing update query logic 
    } 

    public String[] deleteData(query params) throws Exception { 

     //Code implementing delete query logic 
    } 
} 

Теперь мой худший кошмар, что если кто-то прочитал/записывайте данные в мою базу данных без авторизации, так как все мои классы и методы на моем уровне доступа к данным являются «общедоступными». Как я могу это преодолеть?

Т.е., как я могу убедиться, что кто-то обращается к моим классам и методам через уровень доступа к данным после авторизации?

Как узнать вызов моих классов и методов в DataStore или DataStoreImpl? Или есть другая альтернатива?

+0

Вы можете использовать Thread.currentThread(). GetStackTrace(), чтобы узнать, какие методы были вызваны.В противном случае просто поместите поле «проверено» –

+0

«проверено» -> я не смог получить вас @ElMarce – lsof

+0

Да, простой флаг, указывающий, что пользователь авторизован. Другое дело - хранить данные в зашифрованном виде и передавать пароль на уровень доступа к данным, чтобы расшифровать его. –

ответ

1

Во-первых, это не похоже на уровень доступа к данным IMHO. Похоже, вы хотите самостоятельно реализовать защиту кода доступа. Насколько мне кажется, вам не следует беспокоиться о «неавторизованном пользователе, вызывающем метод DAL», поскольку эта ответственность лежит на BLL или коде приложения. Вы можете тренировать своих коллег, как использовать свой код. Конечный пользователь никогда не получит доступ к вашему коду, он будет взаимодействовать с ним только через ваше приложение. Поэтому, если приложение написано правильно, проблема никогда не произойдет.

Кстати, следующие моменты приходят на мой взгляд, если вы все равно нужно: -

  • Inject Authorazation объект в конструкторе DataStoreImpl и проверить его. Если это недействительно, введите соответствующее исключение. Подобное решение с использованием переменной флага уже предложено в комментариях «El Marce».
  • Внедрение лицензирования или блокировки на вашем DAL. Защита вашего приложения и DAL от неаутентичного использования (кто-то неавторизованное копирование вашей DAL-dll и создание собственного кода для вызова методов) и обратное проектирование - это еще одна тема; Я не буду обсуждать это здесь.
  • Зашифровать ваши данные в базе данных (опять же, как было предложено «El Marce») не подходит для меня, поскольку он не будет обрабатывать случаи INSERT, UPDATE, DELETE.
  • Поставьте минимальные спецификации доступа на классы и методы. Если вы можете переместить код уровня доступа к данным на свой уровень BLL, вы можете пометить классы как internal (это C#. Не уверен, что это эквивалентно на Java), что добавит защиту вашим методам.