<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Derby 安全 > 原文: [http://zetcode.com/db/apachederbytutorial/sec/](http://zetcode.com/db/apachederbytutorial/sec/) 在下一章中,我們將提到 Derby 的安全性選項。 我們將在本章中簡要提及兩個基本安全概念。 用戶認證和用戶授權。 用戶認證正在驗證用戶憑據,然后再授予對 Derby 系統的訪問權限。 用戶授權是授予讀取和/或寫入 Derby 數據庫權限的手段。 此外,Derby 允許對磁盤上存儲的數據庫文件進行加密。 Derby 網絡流量可以使用 SSL/TLS 加密協議進行加密。 ## Derby 默認 默認情況下,Derby 不需要用戶認證。 用戶名成為程序中的默認架構,并且用戶密碼將被忽略。 要啟用認證,我們必須修改 Derby 屬性。 用戶授權已關閉。 另外,Derby 沒有數據庫超級用戶。 ## 數據庫所有者 數據庫所有者是創建數據庫的用戶。 如果創建數據庫時沒有提供用戶,則數據庫所有者將設置為默認授權標識符 APP。 當我們啟用 SQL 授權時,控制數據庫所有者很重要。 ## 數據庫加密 Derby 為我們提供了一種加密磁盤上數據的方法。 引導數據庫的用戶必須提供啟動密碼。 創建數據庫時可以對其進行加密。 也可以加密現有的未加密數據庫。 在加密數據庫時,還必須指定啟動密碼,該密碼是用于生成加密鍵的字母數字字符串。 ```java ij> CONNECT 'jdbc:derby:testdb;create=true;dataEncryption=true; bootPassword=3344kkllqq**'; ``` 創建數據庫時,我們可以對其進行加密。 我們將`dataEncryption`屬性設置為`true`,并提供啟動密碼。 現在,每次啟動數據庫時,我們都必須提供啟動密碼。 ```java ij> CONNECT 'jdbc:derby:testdb'; ERROR XJ040: Failed to start database 'testdb' with class loader sun.misc.Launcher$AppClassLoader@360be0, see the next exception for details. ERROR XBM06: Startup failed. An encrypted database cannot be accessed without the correct boot password. ``` 在嵌入式模式下,當我們連接到數據庫時,我們還將引導它。 當我們嘗試在沒有啟動密碼的情況下連接到加密數據庫時,Derby 將顯示以上錯誤消息。 ```java ij> CONNECT 'jdbc:derby:testdb;bootPassword=3344kkllqq**'; ij> SHOW CONNECTIONS; CONNECTION0* - jdbc:derby:testdb * = current connection ``` 使用正確的啟動密碼,我們已成功連接到`testdb`數據庫。 ## 認證方式 認證限制了對正確用戶的訪問。 默認情況下,Derby 中的認證處于關閉狀態。 Derby 通過三種方式提供認證。 * LDAP 外部認證 * 自定義 Java 類 * 內置系統 Derby 官方文檔警告說 Derby 的內置認證機制僅適用于開發和測試目的。 強烈建議生產系統依賴 LDAP 或用戶定義的類進行認證。 ### 嵌入 認證可以設置為兩個級別。 在系統級別或數據庫級別。 ```java ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.user.user12', '34klq*'); 0 rows inserted/updated/deleted ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.connection.requireAuthentication', 'true'); 0 rows inserted/updated/deleted ``` 以上兩個語句可在數據庫級別為當前連接的數據庫啟用用戶認證。 我們使用密碼創建了一個用戶,并啟用了`derby.connection.requireAuthentication`屬性。 ```java ij> CONNECT 'jdbc:derby:testdb'; ERROR 08004: Connection authentication failure occurred. Reason: Invalid authentication.. ij> CONNECT 'jdbc:derby:testdb;user=user12;password=34klq*'; ij> SHOW CONNECTIONS; CONNECTION0* - jdbc:derby:testdb * = current connection ``` 啟用用戶認證后,當我們要連接到`testdb`數據庫時,我們必須提供用戶憑據。 ### 客戶端服務器 在下一個示例中,我們將在客戶端/服務器模式下使用 Derby。 我們有一個加密的`testdb`數據庫。 ```java $ startNetworkServer & ``` Derby 服務器已啟動。 ```java ij> CONNECT 'jdbc:derby://localhost:1527/dbs/testdb;bootPassword=3344kkllqq**'; ``` 首次連接`testdb`數據庫時,必須提供啟動密碼。 這是因為以前我們已經加密了`testdb`數據庫。 ```java ij> CONNECT 'jdbc:derby://localhost:1527/dbs/testdb'; ij> SHOW CONNECTIONS; CONNECTION0* - jdbc:derby://localhost:1527/dbs/testdb * = current connection ``` 一旦數據庫已經啟動,我們就不需要以客戶端/服務器模式啟動數據庫。 與嵌入式模式不同,在嵌入式模式下,我們每次都連接到數據庫時,也會對其進行引導。 在下一步中,我們將在客戶端/服務器模式下啟用用戶認證。 為此,我們需要編輯`derby.properties`文件。 ```java $ stopNetworkServer ``` 首先,如果 Derby 服務器正在運行,我們將其停止。 請注意,啟用用戶認證后,我們需要提供用戶憑據才能停止服務器。 `stopNetworkServer`腳本帶有`-user`和`-password`選項。 ```java $ cat dbs/derby.properties derby.connection.requireAuthentication=true derby.user.user12=34klq* derby.authentication.provider=BUILTIN ``` 在 Derby 系統目錄中,我們修改`derby.properties`文件。 如果文件不存在,我們將創建它。 在屬性文件中,我們啟用身份??驗證并使用密碼創建用戶。 我們還將認證供應器設置為 Derby `BUILTIN`。 ```java $ startNetworkServer & ``` 我們啟動 Derby 服務器。 ```java $ java -Dderby.system.home=/home/janbodnar/programming/derby/dbs \ -Dij.protocol=jdbc:derby: -jar $DERBY_HOME/lib/derbyrun.jar ij ij version 10.8 ij> ``` 我們啟動`ij`工具。 ```java ij> CONNECT 'jdbc:derby:testdb;bootPassword=3344kkllqq**'; ERROR 08004: Connection authentication failure occurred. Reason: Invalid authentication.. ``` 我們嘗試連接到`testdb`數據庫。 由于 Derby 服務器已重新啟動,因此我們提供了啟動密碼。 但是,我們看到一條錯誤消息。 這是因為我們啟用了用戶認證。 我們還必須提供用戶憑據。 ```java ij> CONNECT 'jdbc:derby:testdb;user=user12;password=34klq*; bootPassword=3344kkllqq**'; ``` 使用此連接字符串,我們已成功連接到`testdb`數據庫。 ## 用戶授權 通過 Derby 中的用戶授權,可以授予和撤消訪問系統,數據庫,對象或 SQL 操作的權限。 我們可以在 Derby 中將用戶授權屬性設置為系統級屬性或數據庫級屬性。 Derby 具有一些影響用戶授權的屬性。 `derby.database.defaultConnectionMode`屬性控制默認訪問模式。 如果未設置該屬性,則該屬性默認為`fullAccess`,即具有讀寫訪問權限。 其他兩個選項是`noAccess`和`readOnlyAccess`。 通過`derby.database.fullAccessUsers`和`derby.database.readOnlyAccessUsers`,我們可以控制哪些用戶可以讀寫,哪些用戶可以對數據庫進行只讀訪問。 `derby.database.sqlAuthorization`屬性啟用 SQL 標準授權。 當`derby.database.sqlAuthorization`屬性設置為`true`時,對象所有者可以使用`GRANT`和`REVOKE SQL`語句來設置特定數據庫對象或特定 SQL 操作的用戶權限。 我們可以授予或撤銷的特權是:`DELETE`,`EXECUTE`,`INSERT`,`SELECT`,`REFERENCES`,`TRIGGER`和`UPDATE`。 為`derby.database.defaultConnectionMode`屬性指定的訪問模式將覆蓋數據庫對象所有者授予的權限。 ```java $ cat dbs/derby.properties derby.connection.requireAuthentication=true derby.user.user12=34klq* derby.user.user13=33kl33 derby.user.user14=14kl14 derby.user.user15=35rr++ derby.authentication.provider=BUILTIN derby.database.defaultConnectionMode=readOnlyAccess derby.database.fullAccessUsers=user12 ``` 我們修改`derby.properties`文件。 我們添加了三個用戶。 一個用戶`user12`擁有對數據庫的完全訪問權限。 其他三個具有默認的只讀訪問權限。 ```java export DERBY_OPTS=-Dderby.system.home=/home/janbodnar/programming/derby/dbs ``` 請注意,為了使網絡服務器知道帶有`derby.property`的系統目錄在哪里,我們將`DERBY_OPTS`變量設置為包含 derby 系統目錄。 ```java $ stopNetworkServer $ startNetworkServer & $ java -Dderby.system.home=/home/janbodnar/programming/derby/dbs \ -Dij.protocol=jdbc:derby: -jar $DERBY_HOME/lib/derbyrun.jar ij ``` 我們重新啟動網絡服務器并啟動`ij`工具。 ```java ij> CONNECT 'jdbc:derby://localhost/testdb;user=user13; password=33kl33;bootPassword=3344kkllqq**'; ``` 我們使用`user13`用戶連接到`testdb`數據庫。 由于我們是第一次連接數據庫,因此我們也將其引導。 因此,我們需要啟動密碼,因為該數據庫先前已加密。 ```java ij> SELECT * FROM USER12.CARS; ID |NAME |PRICE ------------------------------------------------------ 1 |Audi |52642 2 |Mercedes |57127 3 |Skoda |9000 4 |Volvo |29000 5 |Bentley |350000 6 |Citroen |21000 7 |Hummer |41400 8 |Volkswagen |21600 8 rows selected ``` `user13`有權查看位于`USER12`模式中的`CARS`表中的數據。 ```java ij> INSERT INTO USER12.CARS VALUES(9, 'Toyota', 27000); ERROR 25502: An SQL data change is not permitted for a read-only connection, user or database. ``` 但是,嘗試修改`CARS`表中的數據會導致錯誤。 未授予執行更改的權限。 ```java ij> DISCONNECT; ij> CONNECT 'jdbc:derby://localhost/testdb;user=user12; password=34klq*'; ``` 我們關閉連接,并連接為`user12`。 該用戶在屬性文件中具有完全訪問權限。 即使`user12`是數據庫的所有者和`CARS`表的所有者,他也不能修改表,除非使用 Derby 屬性具有完全訪問權限。 ```java ij> INSERT INTO CARS VALUES(9, 'Toyota', 27000); 1 row inserted/updated/deleted ij> SELECT * FROM CARS WHERE ID = 9; ID |NAME |PRICE ------------------------------------------------------ 9 |Toyota |27000 1 row selected ``` 我們已經成功地在`CARS`表中添加了新行。 ### SQL 授權 數據庫或表之類的對象的所有者可以進一步限制使用數據庫對象的權限。 我們可以使用`GRANT`和`REVOKE`語句來授予或撤消權限。 數據庫和表的所有者是創建它們的當前用戶。 請注意,`derby.database.defaultConnectionMode`會覆蓋`GRANT`語句賦予的權限。 因此,如果用戶具有通過默認連接方式指定的`readOnlyAccess`,則即使`GRANT`語句授予了該權限,該用戶也無法修改數據庫對象。 當`derby.database.sqlAuthorization`屬性設置為`true`時,對象所有者可以使用`GRANT`和`REVOKE SQL`語句來設置特定數據庫對象或特定 SQL 操作的用戶權限。 請注意,在`derby.properties`文件中設置系統范圍的屬性僅對新數據庫有效。 對于現有數據庫,我們只能設置數據庫范圍的`derby.database.sqlAuthorization`屬性。 在將`derby.database.sqlAuthorization`屬性設置為`true`之后,我們無法將該屬性設置回`false`。 ```java ij> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.sqlAuthorization', 'true'); ``` `derby.database.sqlAuthorization`屬性已設置為 true。 該屬性是靜態的。 我們必須重新啟動`testdb`數據庫以使該屬性正常工作。 ```java ij> CONNECT 'jdbc:derby://localhost/testdb;shutdown=true; user=user12;password=34klq*'; ij> CONNECT 'jdbc:derby://localhost/testdb;user=user12; password=34klq*;bootPassword=3344kkllqq**'; ``` 我們關閉了`testdb`數據庫,然后重新啟動它。 ```java ij(CONNECTION1)> GRANT SELECT ON CARS TO user15; 0 rows inserted/updated/deleted ``` 我們向表`CARS`的`user15`提供`SELECT`特權。 ```java ij(CONNECTION1)> UPDATE CARS SET PRICE=27001 WHERE ID=9; 1 row inserted/updated/deleted ij(CONNECTION1)> SELECT * FROM CARS; ID |NAME |PRICE ------------------------------------------------------ 1 |Audi |52642 2 |Mercedes |57127 3 |Skoda |9000 4 |Volvo |29000 5 |Bentley |350000 6 |Citroen |21000 7 |Hummer |41400 8 |Volkswagen |21600 9 |Toyota |27001 ``` 作為表所有者的`user12`具有完全特權。 上面的命令確認他在`CARS`表上具有`UPDATE`和`SELECT`特權。 ```java ij(CONNECTION1)> DISCONNECT; ij> CONNECT 'jdbc:derby://localhost/testdb;user=user14; password=14kl14'; ij(CONNECTION1)> SELECT * FROM USER12.CARS; ERROR 42502: User 'USER14' does not have SELECT permission on column 'ID' of table 'USER12'.'CARS'. ``` 我們從數據庫斷開連接,并以`user14`身份連接。 嘗試執行`SELECT`語句會導致錯誤。 `user14`不具有對`CARS`表中`SELECT`數據的特權。 ```java ij(CONNECTION1)> DISCONNECT; ij> CONNECT 'jdbc:derby://localhost/testdb;user=user15; password=35rr++'; ij> SELECT * FROM USER12.CARS; ID |NAME |PRICE ------------------------------------------------------ 1 |Audi |52642 2 |Mercedes |57127 3 |Skoda |9000 4 |Volvo |29000 5 |Bentley |350000 6 |Citroen |21000 7 |Hummer |41400 8 |Volkswagen |21600 9 |Toyota |27000 8 rows selected ``` 接下來,我們以`user15`連接。 用戶可以從`CARS`表中選擇數據。 ```java ij(CONNECTION1)> SELECT * FROM USER12.AUTHORS; ERROR 42502: User 'USER15' does not have SELECT permission on column 'ID' of table 'USER12'.'AUTHORS'. ``` 但是他不能從`AUTHORS`表中選擇數據。 表所有者`user12`沒有授予從該表中選擇數據的權限。 ```java ij(CONNECTION1)> UPDATE USER12.CARS SET PRICE=27000 WHERE ID=9; ERROR 25502: An SQL data change is not permitted for a read-only connection, user or database. ``` `user15`在`CARS`表上也沒有`UPDATE`特權。 在本章中,我們討論了 Derby 中的安全性選項。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看