2016-01-02 18 views
1

我使用NATIVE authentication創建數據庫。當我使用臨時密碼創建用戶時,用戶無法使用他們的臨時密碼登錄到數據庫。這是我的代碼;德比NATIVE身份驗證用戶創建

創建用戶;

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. 

如果我嘗試創建相同的用戶,德比又將username already exist錯誤。所以這顯示了我實際上是用戶創建完成了。但我不明白爲什麼密碼不被接受。

- 編輯 -

而且我已經檢查存儲NATIVE用戶SYS.SYSUSERS系統表。我在那裏看到創建的用戶。

QUERY;

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列。但是當我們嘗試在查詢中獲取它時,德比會變成java.sql.SQLSyntaxErrorException: No one can view the 'SYSUSERS'.'PASSWORD' column.例外。

回答

1

--SOLVED--

如果數據庫創建了;

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,其中用戶可以訪問哪些數據庫對象。

+0

我很高興你明白了這一點!如果您能看到一種方法來描述如何改進此功能的文檔,那麼我相信德比開發人員會對此貢獻表示讚賞。 –

+0

實際上德比文件說它。 'DATABASE_PROPERTY總是覆蓋用戶權限'但是我忘記了我正在閱讀的地方。如果我記得我將分享的鏈接。 –

+0

以下鏈接:https://db.apache.org/derby/docs/10.6/devguide/cdevcsecure36595.html'爲derby.database.defaultConnectionMode屬性指定的訪問模式將覆蓋所有者授予的權限一個數據庫對象。例如,如果用戶被授予對錶的INSERT權限,但用戶只具有隻讀連接授權,則用戶無法將數據插入表中。「實際上,德比談到用戶特權不能連接到我認爲的系統。這是你認爲還是計劃中的錯誤? –