Derby NATIVE 身份验证用户创建
Derby NATIVE authentication user creation
我用 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 会出现 username already exist
错误。所以这是告诉我实际上用户创建已经完成。但是我不明白为什么不接受密码。
--编辑--
我还检查了存储 NATIVE
用户的 SYS.SYSUSERS
系统 Table。我在那里看到创建的用户。
查询;
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
系统 table 有 PASSWORD
列。但是当我们尝试在查询中获取它时,derby 变成 java.sql.SQLSyntaxErrorException: No one can view the 'SYSUSERS'.'PASSWORD' column.
异常。
--已解决--
如果数据库创建于;
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')");
用于限制系统 unauthenticated
和 unauthorized
用户的范围。我们可以使用 GRANT
和 REVOKE
哪些用户可以访问哪些数据库对象。
我用 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 会出现 username already exist
错误。所以这是告诉我实际上用户创建已经完成。但是我不明白为什么不接受密码。
--编辑--
我还检查了存储 NATIVE
用户的 SYS.SYSUSERS
系统 Table。我在那里看到创建的用户。
查询;
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
系统 table 有 PASSWORD
列。但是当我们尝试在查询中获取它时,derby 变成 java.sql.SQLSyntaxErrorException: No one can view the 'SYSUSERS'.'PASSWORD' column.
异常。
--已解决--
如果数据库创建于;
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')");
用于限制系统 unauthenticated
和 unauthorized
用户的范围。我们可以使用 GRANT
和 REVOKE
哪些用户可以访问哪些数据库对象。