【问题标题】:Derby NATIVE authentication user creationDerby NATIVE 身份验证用户创建
【发布时间】:2016-01-02 20:50:59
【问题描述】:

我使用NATIVE authentication 创建数据库。当我使用临时密码创建用户时,用户无法使用他们的临时密码登录数据库。这是我的代码;

创建用户;

String uName = userNameTextField.getText();
String pass = new String (passTextField.getPassword());

stmt2.execute("CALL SYSCS_UTIL.SYSCS_CREATE_USER('"+"\""+uName+"\""+"', '"+"\""+pass+"\""+"')");

连接尝试;

Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
String connectionUrl = "jdbc:derby://10.90.232.2:1527/myDB"+";create=false;" + "user=" +"\""+ unameTextField.getText() +"\""+ ";" + "password=" +"\""+ new String (passwordPasswordField.getPassword()) +"\""+ ";"; 
Connection con = DriverManager.getConnection(connectionUrl);

SQLException;

ERROR 08004: DERBY SQL error: ERRORCODE: 40000, SQLSTATE: 08004, SQLERRMC: Database connection refused.

如果我尝试创建相同的用户,derby turn username already exist 错误。所以这是告诉我用户创建实际上已经完成。但我不明白为什么密码不被接受。

--编辑--

我还检查了存储NATIVE 用户的SYS.SYSUSERS 系统表。我在那里看到创建的用户。

查询;

String query = "select USERNAME,HASHINGSCHEME,LASTMODIFIED from SYS.SYSUSERS";
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();  
int columnsNumber = rsmd.getColumnCount();

while (rs.next()) {
   for (int i = 1; i <= columnsNumber; i++) {
      if (i > 1) System.out.print(",  ");
      String columnValue = rs.getString(i);
      System.out.print(columnValue);
   }
   System.out.println("");
}

输出;

owner,  3b62:53f094d5ab95f45fd351aca5856e0c06:1000:SHA-256,  2016-01-03 10:41:45.008
testuser,  3b62:bb98971e23c129fcd6e4cef37e9ac01d:1000:SHA-256,  2016-01-03 10:55:10.969

P.S.:另外SYS.SYSUSERS系统表有PASSWORD列。但是当我们尝试在查询中获取它时,derby 会变成 java.sql.SQLSyntaxErrorException: No one can view the 'SYSUSERS'.'PASSWORD' column. 异常。

【问题讨论】:

    标签: java database derby


    【解决方案1】:

    --已解决--

    如果数据库创建于;

    s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(" +
                    "'derby.database.defaultConnectionMode', 'noAccess')");
    

    用户权限被覆盖。他们无法登录系统。必须是fullAccess

    而且我们必须指定;

    s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(" +
                    "'derby.connection.requireAuthentication', 'true')");
    
    s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(" +
                    "'derby.database.sqlAuthorization', 'true')");
    

    用于限制对系统 unauthenticatedunauthorized 用户的访问。我们可以使用GRANTREVOKE 来获取哪些用户可以访问哪些数据库对象。

    【讨论】:

    • 我很高兴你知道了这一点!如果您能找到一种方法来描述如何改进此功能的文档,我相信 Derby 开发人员会感谢您的贡献。
    • 其实 derby 文档是这么说的。 DATABASE_PROPERTY always override the user permission 但我忘了我在哪里读它。如果我记得我会分享的链接。
    • 这里是链接:db.apache.org/derby/docs/10.6/devguide/cdevcsecure36595.html The access mode specified for the derby.database.defaultConnectionMode property overrides the permissions that are granted by the owner of a database object. For example, if a user is granted INSERT privileges on a table but the user only has read-only connection authorization, the user cannot insert data into the table. 实际上,我认为 Derby 谈论的是用户权限无法连接到系统。您认为这是一个错误还是计划好的事情?
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2015-07-13
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多