Статьи

Пользователи и разрешения базы данных Apache Derby

Аннотация

Apache Derby потрясающий! Особенно в среде микросервисов, где данные для служб (могут) сокращаются и не требуют более насыщенной СУБД. Derby потрясающий, потому что им так легко пользоваться, особенно когда речь идет о пользователях и разрешениях — они вам не нужны! Но, возможно, вы захотите создать пользователя уровня приложения с ограниченными разрешениями для использования в Derby. Цель этого блога — описать, как создавать пользователей с ограниченными правами на уровне приложений в Derby.

отказ

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

Требования

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

  • Apache Derby 10.14.1.0
  • Java 1.8.0_152_x64

Я не собираюсь проходить процесс загрузки и установки этих технологий. Я оставлю это как упражнение для вас.

Запустите сетевой сервер Derby

Первое, что вы должны сделать, это запустить сетевой сервер Derby. В моем предыдущем сообщении в блоге под названием « Несколько сетевых серверов Derby на одном хосте» я дал подробные инструкции о том, как это сделать. Вот это tldr; (для Windows):

конфиг-resiste.cmd

1
2
3
4
5
6
7
8
9
@echo off
REM --- START EDITING ---
set DERBY_HOME=C:\Users\Michael\Applications\Derby\db-derby-10.14.1.0-bin
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_152
set NS_HOME=C:\Users\Michael\Applications\Derby\servers\resiste\data
set NS_PORT=11528
REM --- STOP EDITING ---
set PATH=%DERBY_HOME%\bin;%PATH%
set DERBY_OPTS=-Dderby.drda.portNumber=%NS_PORT% -Dderby.system.home=%NS_HOME%

старт-resiste.cmd

1
2
3
@echo off
call config-resiste.cmd
StartNetworkServer

стоп-resiste.cmd

1
2
3
@echo off
call config-resiste.cmd
StopNetworkServer

Теперь, когда вы можете запустить сетевой сервер Derby, давайте настроим его.

Настройте сетевой сервер Derby

Чтобы настроить сетевой сервер Derby, вам нужно создать файл derby.properties . Но куда файл уходит? Это может пойти в паре разных мест. Давайте взглянем.

Сначала я предполагаю, что вы проигнорировали раздел « Запустить сетевой сервер Derby » выше и вместо этого запускаете Derby со всеми его значениями по умолчанию. В этом случае вы, вероятно, запустили сетевой сервер, найдя %DERBY_HOME%\bin\startNetworkServer.bat и дважды щелкнув по нему. Если вы сделали это — крайне не рекомендуется — тогда Дерби считает, что %DERBY_HOME%\bin является его системным каталогом. Вы можете подтвердить это, посмотрев %DERBY_HOME%\bin\derby.log . Если подтверждено, вам нужно создать %DERBY_HOME%\bin\derby.properties . Где бы ни derby.log файл derby.log , именно там вы создаете файл derby.properties .

С другой стороны, если вы не игнорировали раздел « Запустить Derby Network Server » выше, поздравляем! Файл derby.properties должен derby.properties в каталоге, установленном системным свойством Java -Dderby.system.home . Смотрите config-resiste.cmd файла config-resiste.cmd выше.

Теперь, когда вы знаете, куда поместить файл derby.properties , вот (пример) того, что в него следует поместить:

01
02
03
04
05
06
07
08
09
10
11
# Passwords don't expire for 10 years
derby.authentication.native.passwordLifetimeMillis=315360000000
 
# Use the best hash algorithm you can
derby.authentication.builtin.algorithm=SHA-512
 
# Use a larger salt length for better security
derby.authentication.builtin.saltLength=128
 
# Re-hash this number of times for better security
derby.authentication.builtin.iterations=1564

Теперь у вас настроен сетевой сервер. Запустите это и давайте использовать это. Первое, для чего мы будем его использовать — это настройка пользователя администратора Derby. Мы посмотрим на это дальше.

Run ij

Перед настройкой пользователя-администратора Derby сначала необходимо запустить приложение ij . ij для Derby то же, что sqlplus для Oracle; просто простой интерфейс командной строки. Найдите и запустите %DERBY_HOME%\bin\ij.bat .

ПРИМЕЧАНИЕ Для остальной части блога приглашение "ij>" будет указывать команды SQL, которые должны быть выполнены в ij . Я предполагаю, что вы поймете, что вам нужно запустить ij для выполнения этих команд.

Теперь, когда ij запущен, мы выполним некоторую работу. Давайте посмотрим на этого пользователя администратора Derby.

Создать пользователя Admin

Теперь, когда сетевой сервер Derby настроен и работает, нам нужно настроить администратора. Пользователь с правами администратора будет иметь полные права для выполнения любой операции с базой данных. Давайте посмотрим на команды:

1
2
3
4
ij> connect 'jdbc:derby://localhost:11528/resiste;create=true;' user 'sa_resiste';
ij> CALL SYSCS_UTIL.SYSCS_CREATE_USER('sa_resiste', 'derby123');
ij> disconnect;
ij> exit;

Строка 1 — это стандартная строка подключения JDBC для подключения к базе данных. Имя базы данных — resiste . Поскольку это первое подключение к базе данных, строка подключения содержит create=true; создать базу данных. Я подключаюсь к базе данных с пользователем sa_resiste , и, поскольку база данных создается во время этого первого подключения, пользователь sa_resiste будет настроен как пользователь с правами администратора. Строка 2 создает этого пользователя с паролем derby123 . Строки 3 и 4 затем отключаются от базы данных и выходят из ij .

Перезапустите сетевой сервер сейчас

После перезапуска посмотрим, сработало ли это. Соединитесь с sa_resiste и без пароля. Соединение получит ошибку аутентификации.

1
2
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste';
ERROR 08004: Connection authentication failure occurred.  Reason: Userid or password invalid.

Теперь соединитесь с sa_resiste и паролем. Соединение будет успешным.

1
2
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste' password 'derby123';
ij>

Хороший! Пользователь admin теперь создан. Далее мы будем использовать пользователя admin для создания таблицы. Эта таблица будет использоваться для проверки прав доступа пользователя уровня приложения, который мы создадим позже.

Создать тестовую таблицу

Теперь мы собираемся использовать пользователя admin для создания тестовой таблицы. Мы сделаем это по нескольким причинам.

  1. Убедитесь, что у администратора есть все разрешения и он может выполнять эти команды SQL.
  2. Проверьте разрешения пользователя уровня приложения, который мы создадим позже.
01
02
03
04
05
06
07
08
09
10
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste' password 'derby123';
ij> create schema testing;
ij> set schema testing;
ij> create table names (full_name varchar(100));
ij> insert into names values ('rita red');
ij> select * from names;
FULL_NAME
----------------------------------------------------------------------------------------------------
rita red
ij> disconnect;

Далее давайте создадим пользователя уровня приложения.

Создать пользователя приложения

Теперь самое интересное. Давайте создадим пользователя уровня приложения. Это будет пользователь с разрешением, ограниченным только теми операциями, которые может выполнять приложение. Например, если ваш Microservice только собирается получать данные, то пользователь уровня приложения должен иметь только разрешения SELECT для таблицы базы данных. Мы проверим разрешение пользователя на уровне приложения, но сначала давайте создадим пользователя.

1
2
3
4
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste' password 'derby123';
ij> CALL SYSCS_UTIL.SYSCS_CREATE_USER('oscar', 'orange');
ij> disconnect;
ij> exit;

Перезапустите сетевой сервер сейчас

После перезапуска посмотрим, сработало ли это. Связаться с oscar . Соединение будет успешным, но у oscar не будет разрешения на чтение тестовой таблицы.

1
2
3
4
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'oscar' password 'orange';
ij> select * from testing.names;
ERROR 42502: User 'OSCAR' does not have SELECT permission on column 'FULL_NAME' of table 'TESTING'.'NAMES'.
ij> disconnect;

Даже если оператор SELECT не выполнен, неудача означает успешное тестирование. oscar нет прав доступа, поэтому он не должен быть в состоянии выбирать из тестовой таблицы. Давайте настроим oscar дальше.

Настройте пользователя приложения

Давайте установим некоторые разрешения для oscar . Конечно, для этого sa_resiste администратор sa_resiste .

1
2
3
4
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste' password 'derby123';
ij> set schema testing;
ij> grant select on names to oscar;
ij> disconnect;

Это даст oscar только 1 разрешение: выбирать из таблицы TESTING.NAMES. Посмотрим, сработало ли это.

1
2
3
4
5
6
ij> connect 'jdbc:derby://localhost:11528/resiste' user 'oscar' password 'orange';
ij> select * from testing.names;
FULL_NAME
----------------------------------------------------------------------------------------------------
rita red
ij> disconnect;

Поздравляем! Теперь у вас есть пользователь уровня приложения с ограниченными разрешениями в базе данных Derby.

Резюме

Надеюсь, вам понравилось учиться делать простое администрирование пользователей с помощью Derby.

Опубликовано на Java Code Geeks с разрешения Майкла Ремиджана, партнера нашей программы JCG. См. Оригинальную статью здесь: Пользователи базы данных Apache Derby и разрешения

Мнения, высказанные участниками Java Code Geeks, являются их собственными.