抽象
Apache Derby很棒! 尤其是在微服务环境中,服务的数据(可能)会缩减,并且不需要更强大的RDBMS。 Derby很棒,因为它非常易于使用,尤其是在涉及用户和权限时,您不需要任何东西! 但是,您可能想要创建一个具有有限权限的应用程序级用户,以在Derby中使用。 本博客的目的是记录如何在Derby中创建应用程序级别的受限权限用户。
免责声明
这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但终自己做出决定,风险自负。
要求
我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情,但不能保证。
- Apache Derby 10.14.1.0
- Java 1.8.0_152_x64
我将不涉及下载和安装这些技术的过程。 我将其留给您练习。
运行Derby网络服务器
您必须做的件事是运行Derby网络服务器。 在我之前的博客文章“ 同一主机上的多个Derby网络服务器”中 ,我提供了有关如何执行此操作的详细说明。 这是tldr; (对于Windows):
config-resiste.cmd
- @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%
起始电阻
- @echo off
- call config-resiste.cmd
- StartNetworkServer
停止电阻
- @echo off
- call config-resiste.cmd
- StopNetworkServer
现在您可以运行Derby网络服务器,让我们对其进行配置。
配置Derby网络服务器
要配置Derby网络服务器,您需要创建一个derby.properties
文件。 但是文件去哪了? 它可以在几个不同的地方去。 让我们来看看。
我首先假设您忽略了上面的“运行Derby网络服务器”部分,而是使用所有默认设置运行Derby。 如果是这种情况,您可能通过找到%DERBY_HOME%\bin\startNetworkServer.bat
文件并双击来启动网络服务器。 如果这样做(强烈建议不%DERBY_HOME%\bin
则Derby会认为%DERBY_HOME%\bin
目录是其系统目录。 您可以通过查找%DERBY_HOME%\bin\derby.log
文件来确认。 如果确认,则需要创建%DERBY_HOME%\bin\derby.properties
文件。 无论derby.log
文件在哪里,都可以在其中创建derby.properties
文件。
另一方面,如果您没有忽略上面的“运行Derby网络服务器”部分,那么恭喜您! derby.properties
文件必须进入-Dderby.system.home
Java系统属性设置的目录中。 请参阅上面的config-resiste.cmd
文件示例。
现在您知道将derby.properties
文件放在derby.properties
,这里是(放置示例)其中的内容:
- # 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管理员用户。 接下来我们来看。
运行ij
在配置Derby admin用户之前,我们首先需要运行ij
应用程序。 ij
对Derby而言是sqlplus
对Oracle而言; 只是一个简单的命令行界面。 查找并运行%DERBY_HOME%\bin\ij.bat
。
注意对于博客的其余部分, "ij>"
提示符将指示必须在ij
执行的SQL命令。 我假设您会发现需要运行ij
来执行这些命令。
现在ij
正在运行,我们可以完成一些工作。 让我们看一下该Derby管理员用户。
创建管理员用户
现在,Derby网络服务器已配置并正在运行,我们需要配置admin用户。 管理员用户将具有执行任何数据库操作的完整权限。 让我们看一下命令:
- 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
用户将被设置为admin用户。 第2行使用密码derby123
创建该用户。 然后,第3行和第4行与数据库断开连接并退出ij
。
立即重新启动网络服务器
重新启动后,让我们看看它是否有效。 使用sa_resiste
连接,没有密码。 连接将获得身份验证失败。
- ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste';
- ERROR 08004: Connection authentication failure occurred. Reason: Userid or password invalid.
现在使用sa_resiste
和密码连接。 连接将成功。
- ij> connect 'jdbc:derby://localhost:11528/resiste' user 'sa_resiste' password 'derby123';
- ij>
好! 现在创建了admin用户。 接下来,我们将使用admin用户创建一个表。 该表将用于验证我们稍后将创建的应用程序级用户的权限。
创建测试表
现在,我们将使用admin用户创建测试表。 我们这样做有两个原因。
- 验证管理员用户是否具有所有权限,并且能够执行这些SQL命令。
- 验证稍后将创建的应用程序级用户的权限。
- 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;
接下来,让我们创建应用程序级用户。
创建应用程序用户
现在来看看有趣的东西。 让我们创建一个应用程序级用户。 这将是一个用户,其权限仅限于应用程序能够执行的操作。 例如,如果您的微服务仅用于获取数据,则应用程序级用户应仅对数据库表具有SELECT权限。 我们将测试应用程序级用户的权限,但首先让我们创建用户。
- 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
将无权读取测试表。
- 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
管理员用户才能执行此操作。
- 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表中进行选择。 让我们看看它是否有效。
- ij> connect 'jdbc:derby://localhost:11528/resiste' user 'oscar' password 'orange';
- ij> select * from testing.names;
- FULL_NAME
- ----------------------------------------------------------------------------------------------------
- rita red
- ij> disconnect;
恭喜你! 现在,您的Derby数据库中具有一个应用程序级别的用户,其权限有限。
摘要
希望您喜欢学习如何使用Derby进行简单的用户管理。
翻译自: https://www.javacodegeeks.com/2018/05/apache-derby-database-users-and-permissions.html