我当前正在运行从版本10.13.1.1创建的derby数据库实例 我通过在Redhat服务器上运行的网络模式(startNetworkServer)进行连接。
我现在想升级到10.14.2.0版本
但是,尝试连接到升级的数据库时,我收到拒绝访问“ java.io.FilePermission”错误。
详细信息: 我去下载了10.13.1.1和10.14.2.0版本到我的Windows桌面上。
使用以下命令创建数据库的备份:SYSCS_UTIL.SYSCS_BACKUP_DATABASE
我将此备份复制到10.13和10.14文件夹中。
从当前版本(13)开始,我启动网络服务器,然后使用ij连接到数据库。这工作正常,我可以看到表格。这证明我的备份正常。
connect 'jdbc:derby://localhost:1527/c:\Temp\13\database;create=false';
然后启动14版本的网络服务器,然后转到14的ij。当我尝试连接到备份时:
connect 'jdbc:derby://localhost:1527/c:\Temp\14\database;create=false';
我收到filePermission错误:
错误XJ001:DERBY SQL错误:错误代码:0,SQLSTATE:XJ001,SQLERRMC:java.security.AccessControlException 访问被拒绝(“ java.io.FilePermission”“ C:\ Temp \ updating_derby \ threatadvisor”“读取”) XJ001.U
足够公平,我认为这是因为我试图连接到旧版本,而没有运行upgrade = true参数。当我删除创建参数并添加升级参数时,它仍然会失败,并出现相同的问题。
好,所以也许我不能通过网络服务器升级数据库,而我必须直接连接到该数据库。在我的应用程序中,我使用以下连接字符串:
jdbc:derby:C:/Temp/14/database;upgrade=true;
该应用在类路径上具有版本14 jar,因此应使用它并进行升级。在执行此操作时,该应用程序正常启动,我看到了所有数据。我怎么知道它升级了?因为我试图使用13个网络服务器和ij连接到这14个数据库,但是它失败了(由于版本原因,这是预期的)。
所以我做对了吗?不,我再次尝试使用ij通过网络服务器连接到现在升级的数据库,而我再次遇到java.io.FilePermission问题。
我进入并确保对“数据库”文件夹内的文件夹和文件的实际操作系统权限不只是只读的。没有。仍然会出错。
我什至尝试在Redhat盒上(在另一个端口上)运行14个网络服务器,并尝试通过ij连接到该数据库,甚至出现文件许可问题。
我真的不知所措。请帮忙!
仅供参考,derby.log文件中的完整内容:
2019年6月11日星期二12:04:15:Apache Derby网络服务器-10.14.2.0-(1828579)已启动并准备接受端口1527上的连接 Tue Jun 11 12:04:28 AEST 2019 Thread [DRDAConnThread_2,5,main]清理操作开始 java.security.AccessControlException:访问被拒绝(“ java.io.FilePermission”“ C:\ Temp \ 14 \ database”“读取”) 在java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 在java.security.AccessController.checkPermission(AccessController.java:884) 在java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在java.lang.SecurityManager.checkRead(SecurityManager.java:888) 在java.io.File.exists(File.java:814) 在java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:434) 在java.io.File.getCanonicalPath(File.java:618) 在org.apache.derby.impl.io.DirStorageFactory.doInit(未知来源) 在org.apache.derby.impl.io.BaseStorageFactory.init中(未知源) 在org.apache.derby.impl.io.DirStorageFactory.init中(未知源) 在org.apache.derby.impl.services.monitor.StorageFactoryService.privGetStorageFactoryInstance(未知来源) at org.apache.derby.impl.services.monitor.StorageFactoryService.access $ 400(来源不明) 在org.apache.derby.impl.services.monitor.StorageFactoryService $ 12.run(未知源) 在org.apache.derby.impl.services.monitor.StorageFactoryService $ 12.run(未知源) 在java.security.AccessController.doPrivileged(本机方法) 在org.apache.derby.impl.services.monitor.StorageFactoryService.getCanonicalServiceName(未知来源) 在org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(未知来源) 在org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(未知来源) 在org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(未知来源) 在org.apache.derby.impl.jdbc.EmbedConnection $ 4.run(未知源) 在org.apache.derby.impl.jdbc.EmbedConnection $ 4.run(未知源) 在java.security.AccessController.doPrivileged(本机方法) 在org.apache.derby.impl.jdbc.EmbedConnection.startPersistentService(未知来源) 在org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(未知来源) 在org.apache.derby.impl.jdbc.EmbedConnection(未知来源) 在org.apache.derby.jdbc.InternalDriver $ 1.run(未知源) 在org.apache.derby.jdbc.InternalDriver $ 1.run(未知源) 在java.security.AccessController.doPrivileged(本机方法) 在org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(未知源) 在org.apache.derby.jdbc.InternalDriver.connect(未知来源) 在org.apache.derby.jdbc.InternalDriver.connect(未知来源) 在org.apache.derby.jdbc.EmbeddedDriver.connect(未知来源) 在org.apache.derby.impl.drda.Database.makeConnection(未知来源) 在org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(未知来源) 在org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(未知来源) 在org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(未知来源) 在org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(未知来源) 在org.apache.derby.impl.drda.DRDAConnThread.processCommands(未知来源) 在org.apache.derby.impl.drda.DRDAConnThread.run(未知来源) 清理操作已完成
编辑1 现在尝试按照此guide设置security.policy文件。但是,在基于demo目录中的模板创建了一个新的策略文件之后,我们甚至无法获得derby来拾取我们的文件。 当我们尝试运行时:
java -classpath "C:\Temp\14\lib\derby.jar;C:\Temp\14\lib\derbynet.jar;C:\Temp\14\lib\derbyclient.jar;C:\Temp\14\lib\derbytools.jar;C:\Temp\14\lib\derbyoptionaltools.jar" -Djava.security.manager -Djava.security.policy=C:\Temp\14\server.policy org.apache.derby.drda.NetworkServerControl start
我们收到以下错误:
java.security.AccessControlException:拒绝访问org.apache.derby.security.SystemPermission(“ engine”,“ usederbyinternals”) 在java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 在java.security.AccessController.checkPermission(AccessController.java:884) 在org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(未知来源) 在org.apache.derby.iapi.services.monitor.Monitor.getMonitorLite(未知来源) 在org.apache.derby.iapi.services.property.PropertyUtil $ 2.run(未知源) 在org.apache.derby.iapi.services.property.PropertyUtil $ 2.run(未知源) 在java.security.AccessController.doPrivileged(本机方法) 在org.apache.derby.iapi.services.property.PropertyUtil.getMonitorLite(未知来源) 在org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源) 在org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源) 在org.apache.derby.impl.drda.NetworkServerControlImpl.init(未知来源) 在org.apache.derby.impl.drda.NetworkServerControlImpl。处(未知来源) 在org.apache.derby.drda.NetworkServerControl.main(未知来源)
我知道这一行在策略文件中(且未注释):
permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals";
但是,我认为它甚至没有在提取我们的策略文件,好像我们将引用更改为不存在的策略文件一样,我们仍然会遇到相同的错误。
答案 0 :(得分:1)
对于此问题,还有另一种解决方法:
并使用此: Policy.setPolicy(new DerbyPolicy());
要以编程方式获取策略集。
答案 1 :(得分:0)
感谢@BryanPendleton为我指出了正确的方向。对于最初的问题,确实是因为我们需要server.policy文件。他的链接很有帮助: db.apache.org/derby/docs/10.14/security/csecjavasecurity.html
使用位于此处的server.policy文件模板解决了我们遇到的第二个问题: https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/security/rsecbasicserver.html
而不是下载中提供的那个(derby下载中的那个没有其中提到的那么多个jar)。更重要的是,我们对罐子的引用方式必须进行调整。您将看到所有示例都是针对unix格式的,而我们是在测试Windows PC上进行开发的。因此,而不是像(unix)这样的东西:
grant codeBase "file:///home/someone/derby/lib/derby.jar"
我们需要这样做:
grant codeBase "file:///C:/Temp/14/lib/derby.jar"
请注意在“文件”之后的附加“ /”-我们假设它只是“ file:// C:....”