This is an automated email from the ASF dual-hosted git repository.

jshao pushed a commit to branch branch-0.6
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-0.6 by this push:
     new 2bab1d2b7 [#4467] improve(docs): Refactor the security document and 
add access control page (#4538)
2bab1d2b7 is described below

commit 2bab1d2b756fa0aae745ef5684941c889fb3b38b
Author: roryqi <[email protected]>
AuthorDate: Thu Aug 15 17:44:01 2024 +0800

    [#4467] improve(docs): Refactor the security document and add access 
control page (#4538)
    
    ### What changes were proposed in this pull request?
    
    Refactor the security document and add access control  page.
    
    ### Why are the changes needed?
    
    Fix: #4467
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    Just docs.
---
 docs/assets/object.png               | Bin 0 -> 97593 bytes
 docs/assets/privilege.png            | Bin 0 -> 73113 bytes
 docs/assets/role.png                 | Bin 0 -> 137049 bytes
 docs/assets/user-group.png           | Bin 0 -> 138859 bytes
 docs/assets/workflow.png             | Bin 0 -> 227766 bytes
 docs/gravitino-server-config.md      |   2 +-
 docs/how-to-use-gvfs.md              |   4 +-
 docs/iceberg-rest-service.md         |   2 +-
 docs/index.md                        |  11 +-
 docs/security.md                     | 327 ------------------
 docs/security/access-control.md      | 640 +++++++++++++++++++++++++++++++++++
 docs/security/how-to-authenticate.md | 174 ++++++++++
 docs/security/how-to-use-cors.md     |  36 ++
 docs/security/how-to-use-https.md    | 127 +++++++
 docs/security/security.md            |  20 ++
 docs/webui.md                        |   6 +-
 16 files changed, 1013 insertions(+), 336 deletions(-)

diff --git a/docs/assets/object.png b/docs/assets/object.png
new file mode 100644
index 000000000..9eafcc2fe
Binary files /dev/null and b/docs/assets/object.png differ
diff --git a/docs/assets/privilege.png b/docs/assets/privilege.png
new file mode 100644
index 000000000..cef89e271
Binary files /dev/null and b/docs/assets/privilege.png differ
diff --git a/docs/assets/role.png b/docs/assets/role.png
new file mode 100644
index 000000000..4345dd8f2
Binary files /dev/null and b/docs/assets/role.png differ
diff --git a/docs/assets/user-group.png b/docs/assets/user-group.png
new file mode 100644
index 000000000..b26773e3e
Binary files /dev/null and b/docs/assets/user-group.png differ
diff --git a/docs/assets/workflow.png b/docs/assets/workflow.png
new file mode 100644
index 000000000..83a4bae24
Binary files /dev/null and b/docs/assets/workflow.png differ
diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md
index 4f3fba6c7..785269024 100644
--- a/docs/gravitino-server-config.md
+++ b/docs/gravitino-server-config.md
@@ -140,7 +140,7 @@ For more details, please refer to the definition of the 
plugin.
 
 ### Security configuration
 
-Refer to [security](security.md) for HTTPS and authentication configurations.
+Refer to [security](security/security.md) for HTTPS and authentication 
configurations.
 
 ### Metrics configuration
 
diff --git a/docs/how-to-use-gvfs.md b/docs/how-to-use-gvfs.md
index 579bd981e..ec3dd6ccd 100644
--- a/docs/how-to-use-gvfs.md
+++ b/docs/how-to-use-gvfs.md
@@ -274,7 +274,7 @@ FileSystem fs = filesetPath.getFileSystem(conf);
 ##### Using `OAuth` authentication
 
 If you want to use `oauth2` authentication for the Gravitino client in the 
Gravitino Virtual File System,
-please refer to this document to complete the configuration of the Gravitino 
server and the OAuth server: [Security](./security.md).
+please refer to this document to complete the configuration of the Gravitino 
server and the OAuth server: [Security](security/security.md).
 
 Then, you can configure the Hadoop configuration like this:
 
@@ -298,7 +298,7 @@ FileSystem fs = filesetPath.getFileSystem(conf);
 ##### Using `Kerberos` authentication
 
 If you want to use `kerberos` authentication for the Gravitino client in the 
Gravitino Virtual File System,
-please refer to this document to complete the configuration of the Gravitino 
server: [Security](./security.md).
+please refer to this document to complete the configuration of the Gravitino 
server: [Security](security/security.md).
 
 Then, you can configure the Hadoop configuration like this:
 
diff --git a/docs/iceberg-rest-service.md b/docs/iceberg-rest-service.md
index e0e790b5e..3b2c239b3 100644
--- a/docs/iceberg-rest-service.md
+++ b/docs/iceberg-rest-service.md
@@ -81,7 +81,7 @@ You can also specify filter parameters by setting 
configuration entries in the s
 
 ### Security
 
-Gravitino Iceberg REST server supports OAuth2 and HTTPS, please refer to 
[Security](./security.md) for more details.
+Gravitino Iceberg REST server supports OAuth2 and HTTPS, please refer to 
[Security](security/security.md) for more details.
 
 ### Storage
 
diff --git a/docs/index.md b/docs/index.md
index 4909cf34a..7eca72edc 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -144,11 +144,18 @@ Gravitino provides a Flink connector to manage metadata 
in a unified way. To use
 
 Gravitino provides several ways to configure and manage the Gravitino server. 
See:
 
-* [Security](./security.md): provides security configurations for Gravitino, 
including HTTPS
-  and OAuth2 configurations.
 * [Gravitino metrics](./metrics.md): provides metrics configurations and 
detailed a metrics list
   of the Gravitino server.
 
+### Security
+
+Gravitino provides security configurations for Gravitino, including HTTPS, 
authentication and access control configurations.
+
+* [HTTPS](./security/how-to-use-https.md): provides HTTPS configurations.
+* [Authentication](./security/how-to-authenticate.md): provides authentication 
configurations including simple, OAuth, Kerberos.
+* [Access Control](./security/access-control.md): provides access control 
configurations.
+* [CORS](./security/how-to-use-cors.md): provides CORS configurations.
+
 ### Programming guides
 
 * [Gravitino Open API](./api/rest/gravitino-rest-api): provides the complete 
Open API definition of
diff --git a/docs/security.md b/docs/security.md
deleted file mode 100644
index 87aaeed6f..000000000
--- a/docs/security.md
+++ /dev/null
@@ -1,327 +0,0 @@
----
-title: "Security"
-slug: /security
-keyword: security
-license: "This software is licensed under the Apache License version 2."
----
-
-## Authentication
-
-Apache Gravitino supports three kinds of authentication mechanisms: simple, 
OAuth and Kerberos.
-
-### Simple mode
-
-Simple mode is the default authentication option of the server.
-
-For the client side, if it doesn't set the authentication explicitly, it will 
use anonymous to access the server.
-
-If the client sets the simple mode,  it will use the environment variable 
`GRAVITINO_USER` as the user. 
-
-If the environment variable `GRAVITINO_USER` isn't set, the client uses the 
user of the machine that sends requests.
-
-For the client side, users can enable `simple` mode by the following code:
-
-```java
-GravitinoClient client = GravitinoClient.builder(uri)
-    .withMetalake("metalake")
-    .withSimpleAuth()
-    .build();
-```
-
-### OAuth mode
-
-Gravitino only supports external OAuth 2.0 servers.
-
-First, users need to guarantee that the external correctly configured OAuth 
2.0 server supports Bearer JWT.
-
-Then, on the server side, users should set `gravitino.authenticators` as 
`oauth` and give
-`gravitino.authenticator.oauth.defaultSignKey`, 
`gravitino.authenticator.oauth.serverUri` and
-`gravitino.authenticator.oauth.tokenPath`  a proper value.
-
-Next, for the client side, users can enable `OAuth` mode by the following code:
-
-```java
-DefaultOAuth2TokenProvider authDataProvider = 
DefaultOAuth2TokenProvider.builder()
-    .withUri("oauth server uri")
-    .withCredential("yy:xx")
-    .withPath("oauth/token")
-    .withScope("test")
-    .build();
-
-GravitinoClient client = GravitinoClient.builder(uri)
-    .withMetalake("metalake")
-    .withOAuth(authDataProvider)
-    .build();
-```
-
-### Kerberos mode
-
-Gravitino supports Kerberos mode.
-
-For the server side, users should set `gravitino.authenticators` as `kerberos` 
and give
-`gravitino.authenticator.kerberos.principal` and 
`gravitino.authenticator.kerberos.keytab` a proper value.
-
-For the client side, users can enable `kerberos` mode by the following code:
-
-```java
-// Use keytab to create KerberosTokenProvider
-KerberosTokenProvider provider = KerberosTokenProvider.builder()
-        .withClientPrincipal(clientPrincipal)
-        .withKeyTabFile(new File(keytabFile))
-        .build();
-
-// Use ticketCache to create KerberosTokenProvider
-KerberosTokenProvider provider = KerberosTokenProvider.builder()
-        .withClientPrincipal(clientPrincipal)
-        .build();        
-
-GravitinoClient client = GravitinoClient.builder(uri)
-    .withMetalake("metalake")
-    .withKerberosAuth(provider)
-    .build();
-```
-
-:::info
-Now Iceberg REST service doesn't support Kerberos authentication.
-The URI must use the hostname of server instead of IP.
-:::
-
-### Server configuration
-
-| Configuration item                                | Description              
                                                                                
                                                                                
                                                                 | Default 
value     | Required                                   | Since version |
-|---------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|--------------------------------------------|---------------|
-| `gravitino.authenticator`                         | It is deprecated since 
Gravitino 0.6.0. Please use `gravitino.authenticators` instead.                 
                                                                                
                                                                   | `simple`   
       | No                                         | 0.3.0         |
-| `gravitino.authenticators`                        | The authenticators which 
Gravitino uses, setting as `simple`,`oauth` or `kerberos`. Multiple 
authenticators are separated by commas. If a request is supported by multiple 
authenticators simultaneously, the first authenticator will be used by default 
| `simple`          | No                                         | 0.6.0        
 |
-| `gravitino.authenticator.oauth.serviceAudience`   | The audience name when 
Gravitino uses OAuth as the authenticator.                                      
                                                                                
                                                                   | 
`GravitinoServer` | No                                         | 0.3.0         |
-| `gravitino.authenticator.oauth.allowSkewSecs`     | The JWT allows skew 
seconds when Gravitino uses OAuth as the authenticator.                         
                                                                                
                                                                      | `0`     
          | No                                         | 0.3.0         |
-| `gravitino.authenticator.oauth.defaultSignKey`    | The signing key of JWT 
when Gravitino uses OAuth as the authenticator.                                 
                                                                                
                                                                   | (none)     
       | Yes if use `oauth` as the authenticator    | 0.3.0         |
-| `gravitino.authenticator.oauth.signAlgorithmType` | The signature algorithm 
when Gravitino uses OAuth as the authenticator.                                 
                                                                                
                                                                  | `RS256`     
      | No                                         | 0.3.0         |
-| `gravitino.authenticator.oauth.serverUri`         | The URI of the default 
OAuth server.                                                                   
                                                                                
                                                                   | (none)     
       | Yes if use `oauth` as the authenticator    | 0.3.0         |
-| `gravitino.authenticator.oauth.tokenPath`         | The path for token of 
the default OAuth server.                                                       
                                                                                
                                                                    | (none)    
        | Yes if use `oauth` as the authenticator    | 0.3.0         |
-| `gravitino.authenticator.kerberos.principal`      | Indicates the Kerberos 
principal to be used for HTTP endpoint. Principal should start with `HTTP/`.    
                                                                                
                                                                   | (none)     
       | Yes if use `kerberos` as the authenticator | 0.4.0         |
-| `gravitino.authenticator.kerberos.keytab`         | Location of the keytab 
file with the credentials for the principal.                                    
                                                                                
                                                                   | (none)     
       | Yes if use `kerberos` as the authenticator | 0.4.0         |
-
-The signature algorithms that Gravitino supports follows:
-
-| Name  | Description                                    |
-|-------|------------------------------------------------|
-| HS256 | HMAC using SHA-25A                             |
-| HS384 | HMAC using SHA-384                             |
-| HS512 | HMAC using SHA-51                              |
-| RS256 | RSASSA-PKCS-v1_5 using SHA-256                 |
-| RS384 | RSASSA-PKCS-v1_5 using SHA-384                 |
-| RS512 | RSASSA-PKCS-v1_5 using SHA-512                 |
-| ES256 | ECDSA using P-256 and SHA-256                  |
-| ES384 | ECDSA using P-384 and SHA-384                  |
-| ES512 | ECDSA using P-521 and SHA-512                  |
-| PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 |
-| PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 |
-| PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 |
-
-### Example
-
-You can follow the steps to set up an OAuth mode Gravitino server.
-
-1. Prerequisite
-
-   You need to install the JDK8 and Docker.
-
-2. Set up an external OAuth 2.0 server
-
-   There is a sample-authorization-server based on 
[spring-authorization-server](https://github.com/spring-projects/spring-authorization-server/tree/1.0.3).
-
-   The image has registered client information in the external OAuth 2.0 
server.
-
-   Its clientId is `test`. Its secret is `test`. Its scope is `test`.
-
-```shell
- docker run -p 8177:8177 --name sample-auth-server -d 
datastrato/sample-authorization-server:0.3.0
-```
-
-3. Open [the JWK URL of the Authorization 
server](http://localhost:8177/oauth2/jwks) in the browser and you can get the 
JWK.
-   
-   ![jks_response_image](assets/jks.png)
-
-4. Convert the JWK to PEM. You can use the [online 
tool](https://8gwifi.org/jwkconvertfunctions.jsp#google_vignette) or other 
tools.
-
-   ![pem_convert_result_image](assets/pem.png)
-
-5. Copy the public key and remove the character `\n` and you can get the 
default signing key of Gravitino server.
-
-6. You can refer to the [Configurations](gravitino-server-config.md) and 
append the configurations to the conf/gravitino.conf.
-
-```text
-gravitino.authenticators = oauth
-gravitino.authenticator.oauth.serviceAudience = test
-gravitino.authenticator.oauth.defaultSignKey = <the default signing key>
-gravitino.authenticator.oauth.tokenPath = /oauth2/token
-gravitino.authenticator.oauth.serverUri = http://localhost:8177
-```
-
-7. Open [the URL of Gravitino server](http://localhost:8090) and login in with 
clientId `test`, clientSecret `test`, and scope `test`.
-   
-   ![oauth_login_image](assets/oauth.png)
-
-8. You can also use the curl command to access Gravitino.
-
-Get access token
-
-```shell
-curl --location --request POST 
'http://127.0.0.1:8177/oauth2/token?grant_type=client_credentials&client_id=test&client_secret=test&scope=test'
-```
-
-Use the access token to request the Gravitino
-
-```shell
-curl -v -X GET -H "Accept: application/vnd.gravitino.v1+json" -H 
"Content-Type: application/json" -H "Authorization: Bearer <access_token>" 
http://localhost:8090/api/version
-```
-
-## HTTPS
-
-Users would better use HTTPS instead of HTTP if users choose OAuth 2.0 as the 
authenticator.
-
-HTTPS protects the header of the request from smuggling, making it safer.
-
-If users choose to enable HTTPS, Gravitino won't provide the ability of HTTP 
service.
-
-Both the Gravitino server and Iceberg REST service can configure HTTPS.
-
-### Apache Gravitino server's configuration
-
-| Configuration item                                  | Description            
                                            | Default value | Required          
                                | Since version |
-|-----------------------------------------------------|--------------------------------------------------------------------|---------------|---------------------------------------------------|---------------|
-| `gravitino.server.webserver.enableHttps`            | Enables HTTPS.         
                                            | `false`       | No                
                                | 0.3.0         |
-| `gravitino.server.webserver.httpsPort`              | The HTTPS port number 
of the Jetty web server.                     | `8433`        | No               
                                 | 0.3.0         |
-| `gravitino.server.webserver.keyStorePath`           | Path to the key store 
file.                                        | (none)        | Yes if use HTTPS 
                                 | 0.3.0         |
-| `gravitino.server.webserver.keyStorePassword`       | Password to the key 
store.                                         | (none)        | Yes if use 
HTTPS                                  | 0.3.0         |
-| `gravitino.server.webserver.keyStoreType`           | The type to the key 
store.                                         | `JKS`         | No             
                                   | 0.3.0         |
-| `gravitino.server.webserver.managerPassword`        | Manager password to 
the key store.                                 | (none)        | Yes if use 
HTTPS                                  | 0.3.0         |
-| `gravitino.server.webserver.tlsProtocol`            | TLS protocol to use. 
The JVM must support the TLS protocol to use. | (none)        | No              
                                  | 0.3.0         |
-| `gravitino.server.webserver.enableCipherAlgorithms` | The collection of 
enabled cipher algorithms.                       | ``            | No           
                                     | 0.3.0         |
-| `gravitino.server.webserver.enableClientAuth`       | Enables the 
authentication of the client.                          | `false`       | No     
                                           | 0.3.0         |
-| `gravitino.server.webserver.trustStorePath`         | Path to the trust 
store file.                                      | (none)        | Yes if use 
HTTPS and the authentication of client | 0.3.0         |
-| `gravitino.server.webserver.trustStorePassword`     | Password to the trust 
store.                                       | (none)        | Yes if use HTTPS 
and the authentication of client | 0.3.0         |
-| `gravitino.server.webserver.trustStoreType`         | The type to the trust 
store.                                       | `JKS`         | No               
                                 | 0.3.0         |
-
-### Apache Iceberg REST service's configuration
-
-| Configuration item                              | Description                
                                        | Default value | Required              
                            | Since version |
-|-------------------------------------------------|--------------------------------------------------------------------|---------------|---------------------------------------------------|---------------|
-| `gravitino.iceberg-rest.enableHttps`            | Enables HTTPS.             
                                        | `false`       | No                    
                            | 0.3.0         |
-| `gravitino.iceberg-rest.httpsPort`              | The HTTPS port number of 
the Jetty web server.                     | `9433`        | No                  
                              | 0.3.0         |
-| `gravitino.iceberg-rest.keyStorePath`           | Path to the key store 
file.                                        | (none)        | Yes if use HTTPS 
                                 | 0.3.0         |
-| `gravitino.iceberg-rest.keyStorePassword`       | Password to the key store. 
                                        | (none)        | Yes if use HTTPS      
                            | 0.3.0         |
-| `gravitino.iceberg-rest.keyStoreType`           | The type to the key store. 
                                        | `JKS`         | No                    
                            | 0.3.0         |
-| `gravitino.iceberg-rest.managerPassword`        | Manager password to the 
key store.                                 | (none)        | Yes if use HTTPS   
                               | 0.3.0         |
-| `gravitino.iceberg-rest.tlsProtocol`            | TLS protocol to use. The 
JVM must support the TLS protocol to use. | (none)        | No                  
                              | 0.3.0         |
-| `gravitino.iceberg-rest.enableCipherAlgorithms` | The collection of enabled 
cipher algorithms.                       | ``            | No                   
                             | 0.3.0         |
-| `gravitino.iceberg-rest.enableClientAuth`       | Enables the authentication 
of the client.                          | `false`       | No                    
                            | 0.3.0         |
-| `gravitino.iceberg-rest.trustStorePath`         | Path to the trust store 
file.                                      | (none)        | Yes if use HTTPS 
and the authentication of client | 0.3.0         |
-| `gravitino.iceberg-rest.trustStorePassword`     | Password to the trust 
store.                                       | (none)        | Yes if use HTTPS 
and the authentication of client | 0.3.0         |
-| `gravitino.iceberg-rest.trustStoreType`         | The type to the trust 
store.                                       | `JKS`         | No               
                                 | 0.3.0         |
-
-Refer to the "Additional JSSE Standard Names" section of the [Java security 
guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#jssenames)
 for the list of protocols related to tlsProtocol. You can find the list of 
`tlsProtocol` values for Java 8 in this document.
-
-Refer to the "Additional JSSE Standard Names" section of the [Java security 
guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#ciphersuites)
 for the list of protocols related to tlsProtocol. You can find the list of 
`enableCipherAlgorithms` values for Java 8 in this document.
-
-### Example
-
-You can follow the steps to set up an HTTPS server.
-
-1. Prerequisite
-
-   You need to install the JDK8, wget, and set the environment JAVA_HOME.
-
-   If you want to use the command `curl` to request the Gravitino server, you 
should install openSSL.
-
-2. Generate the key store
-
-```shell
-cd $JAVA_HOME
-bin/keytool -genkeypair  -alias localhost \
--keyalg RSA -keysize 4096 -keypass localhost \
--sigalg SHA256withRSA \
--keystore localhost.jks -storetype JKS -storepass localhost \
--dname "cn=localhost,ou=localhost,o=localhost,l=beijing,st=beijing,c=cn" \
--validity 36500
-```
-
-3. Generate the certificate
-
-```shell
-bin/keytool -export -alias localhost -keystore localhost.jks -file  
localhost.crt -storepass localhost
-```
-
-4. Import the certificate
-
-```shell
-bin/keytool -import -alias localhost -keystore jre/lib/security/cacerts -file 
localhost.crt -storepass changeit -noprompt
-```
-
-5. You can refer to the [Configurations](gravitino-server-config.md) and 
append the configuration to the conf/gravitino.conf.
-Configuration doesn't support resolving environment variables, so you should 
replace `${JAVA_HOME}` with the actual value.
-Then, You can start the Gravitino server.
-
-```text
-gravitino.server.webserver.host = localhost
-gravitino.server.webserver.enableHttps = true
-gravitino.server.webserver.keyStorePath = ${JAVA_HOME}/localhost.jks
-gravitino.server.webserver.keyStorePassword = localhost
-gravitino.server.webserver.managerPassword = localhost
-```
-
-6. Request the Gravitino server
-
-   If you use Java, you can follow the steps
-
-   Copy the code to a file named Main.java
-
-```java
-import org.apache.gravitino.client.GravitinoClient;
-import org.apache.gravitino.client.GravitinoVersion;
-
-public class Main {
-    public static void main(String[] args) {
-        String uri = "https://localhost:8433";;
-        GravitinoClient client = 
GravitinoClient.builder(uri).withMetalake("metalake").build();
-        GravitinoVersion gravitinoVersion = client.getVersion();
-        System.out.println(gravitinoVersion);
-    }
-}
-```
-
-If you want to use the command `curl`, you can follow the commands:
-
-```shell
-openssl x509 -inform der -in $JAVA_HOME/localhost.crt -out certificate.pem
-curl -v -X GET --cacert ./certificate.pem -H "Accept: 
application/vnd.gravitino.v1+json" -H "Content-Type: application/json" 
https://localhost:8433/api/version
-```
-## Cross-origin resource filter
-
-### Server configuration
-
-| Configuration item                                 | Description             
                                                                                
                                                                                
                                               | Default value                  
               | Required | Since version |
-|----------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|----------|---------------|
-| `gravitino.server.webserver.enableCorsFilter`      | Enable cross-origin 
resource share filter.                                                          
                                                                                
                                                   | false                      
                   | No       | 0.4.0         |
-| `gravitino.server.webserver.allowedOrigins`        | A comma separated list 
of allowed origins to access the resources. The default value is *, which means 
all origins.                                                                    
                                                | `*`                           
                | No       | 0.4.0         |
-| `gravitino.server.webserver.allowedTimingOrigins`  | A comma separated list 
of allowed origins to time the resource. The default value is the empty string, 
which means no origins.                                                         
                                                | ``                            
                | No       | 0.4.0         |
-| `gravitino.server.webserver.allowedMethods`        | A comma separated list 
of allowed HTTP methods used when accessing the resources. The default values 
are GET, POST, HEAD, and DELETE.                                                
                                                  | `GET,POST,HEAD,DELETE,PUT`  
                  | No       | 0.4.0         |
-| `gravitino.server.webserver.allowedHeaders`        | A comma separated list 
of allowed HTTP headers specified when accessing the resources. The default 
value is X-Requested-With,Content-Type,Accept,Origin. If the value is a single 
*, it accepts all headers.                           | 
`X-Requested-With,Content-Type,Accept,Origin` | No       | 0.4.0         |
-| `gravitino.server.webserver.preflightMaxAgeInSecs` | The number of seconds 
to cache preflight requests by the client. The default value is 1800 seconds or 
30 minutes.                                                                     
                                                 | `1800`                       
                 | No       | 0.4.0         |
-| `gravitino.server.webserver.allowCredentials`      | A boolean indicating if 
the resource allows requests with credentials. The default value is true.       
                                                                                
                                               | `true`                         
               | No       | 0.4.0         |
-| `gravitino.server.webserver.exposedHeaders`        | A comma separated list 
of allowed HTTP headers exposed on the client. The default value is the empty 
list.                                                                           
                                                  | ``                          
                  | No       | 0.4.0         |
-| `gravitino.server.webserver.chainPreflight`        | If true chained 
preflight requests for normal handling (as an OPTION request). Otherwise, the 
filter responds to the preflight. The default is true.                          
                                                         | `true`               
                         | No       | 0.4.0         |
-
-### Apache Iceberg REST service's configuration
-
-| Configuration item                             | Description                 
                                                                                
                                                                                
                 | Default value                                 | Required | 
Since version |
-|------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|----------|---------------|
-| `gravitino.iceberg-rest.enableCorsFilter`      | Enable cross-origin 
resource share filter.                                                          
                                                                                
                         | false                                         | No   
    | 0.4.0         |
-| `gravitino.iceberg-rest.allowedOrigins`        | A comma separated list of 
allowed origins that access the resources. The default value is *, which means 
all origins.                                                                    
                    | `*`                                           | No       
| 0.4.0         |
-| `gravitino.iceberg-rest.allowedTimingOrigins`  | A comma separated list of 
allowed origins that time the resource. The default value is the empty string, 
which means no origins.                                                         
                    | ``                                            | No       
| 0.4.0         |
-| `gravitino.iceberg-rest.allowedMethods`        | A comma separated list of 
allowed HTTP methods used when accessing the resources. The default values are 
GET, POST, HEAD, and DELETE.                                                    
                    | `GET,POST,HEAD,DELETE,PUT`                    | No       
| 0.4.0         |
-| `gravitino.iceberg-rest.allowedHeaders`        | A comma separated list of 
HTTP allowed headers specified when accessing the resources. The default value 
is X-Requested-With,Content-Type,Accept,Origin. If the value is a single *, it 
accepts all headers. | `X-Requested-With,Content-Type,Accept,Origin` | No       
| 0.4.0         |
-| `gravitino.iceberg-rest.preflightMaxAgeInSecs` | The number of seconds to 
cache preflight requests by the client. The default value is 1800 seconds or 30 
minutes.                                                                        
                    | `1800`                                        | No       
| 0.4.0         |
-| `gravitino.iceberg-rest.allowCredentials`      | A boolean indicating if the 
resource allows requests with credentials. The default value is true.           
                                                                                
                 | `true`                                        | No       | 
0.4.0         |
-| `gravitino.iceberg-rest.exposedHeaders`        | A comma separated list of 
allowed HTTP headers exposed on the client. The default value is the empty 
list.                                                                           
                        | ``                                            | No    
   | 0.4.0         |
-| `gravitino.iceberg-rest.chainPreflight`        | If true chained preflight 
requests for normal handling (as an OPTION request). Otherwise, the filter 
responds to the preflight. The default is true.                                 
                        | `true`                                        | No    
   | 0.4.0         |
diff --git a/docs/security/access-control.md b/docs/security/access-control.md
new file mode 100644
index 000000000..902fc0591
--- /dev/null
+++ b/docs/security/access-control.md
@@ -0,0 +1,640 @@
+---
+title: "Access Control"
+slug: /security/access-control
+keyword: security
+license: "This software is licensed under the Apache License version 2."
+---
+
+## Overview
+
+Gravitino adopts RBAC and DAC. 
+
+Role-based Access Control (RBAC): Access privileges are assigned to roles, 
which are in turn assigned to users or groups.
+
+Discretionary Access Control(DAC): Each metadata object has an owner, who can 
in turn grant access to that object.
+
+:::info
+
+Gravitino only supports authorization for securable objects, when Gravitino 
supports to pass the privileges to underlying authorization plugin.
+Gravitino doesn't support metadata authentication. It means that Gravitino 
won't check the privileges when Gravitino receives the requests.
+
+:::
+
+
+## Concept
+
+### Role
+
+A metadata object to which privileges can be granted. Roles are in turn 
assigned to users or groups.
+
+### Privilege
+
+A defined level of access to an object. Multiple distinct privileges may be 
used to control the granularity of access granted.
+
+### User
+
+A user identity recognized by Gravitino. External user system instead of 
Gravitino manages users. 
+
+### Group
+
+A group identity recognized by Gravitino. External user system instead of 
Gravitino manages groups. 
+
+### Metadata objects
+
+Metadata objects are managed in Gravitino, such as `CATALOG`, `SCHEMA`, 
`TABLE`,
+`COLUMN`, `FILESET`, `TOPIC`, `COLUMN`, `ROLE`, `METALAKE`. A metadata object 
is combined by a `type` and a
+comma-separated `name`. For example, a `CATAGLOG` object has a name "catalog1" 
with type
+"CATALOG", a `SCHEMA` object has a name "catalog1.schema1" with type "SCHEMA", 
a `TABLE`
+object has a name "catalog1.schema1.table1" with type "TABLE". A `METALAKE` 
object has a name "metalake1".
+
+### Securable objects
+
+A metadata object to which access can be granted. Unless allowed by a grant, 
access is denied. 
+Every securable object resides within a logical container in a hierarchy of 
containers.
+The top container is the metalake. 
+Catalogs are under the metalake. Catalogs represent different kinds of data 
sources.
+Schemas are under the catalog. There are tables, topics, or filesets under the 
schema.
+
+![object_image](../assets/object.png)
+
+The relationship of the concepts is as below.
+
+![user_group_relationship_image](../assets/user-group.png)
+![concept_relationship_image](../assets/role.png)
+
+### Ownership
+
+Every metadata object has an owner. The owner could be a user or group, and 
has all the privileges of the metadata object.
+Meanwhile, you can transfer the ownership of securable object to another user 
or group.
+
+## The types of roles
+
+### Service Admin
+
+Service admin is only used for managing the metalakes. Usually, this role is 
for the maintainer of the service.
+
+### Custom Roles
+
+You can also create a dedicated role for your business by API or the client.
+
+## The types of privileges
+
+### User privileges
+
+| Name        | Supports Securable Object | Operation           |
+|-------------|---------------------------|---------------------|
+| ManageUsers | Metalake                  | Add or remove users |
+
+### Group privileges
+
+| Name         | Supports Securable Object | Operation            |
+|--------------|---------------------------|----------------------|
+| ManageGroups | Metalake                  | Add or remove groups |
+
+### Role privileges
+
+| Name       | Supports Securable Object | Operation     |
+|------------|---------------------------|---------------|
+| CreateRole | Metalake                  | Create a role |
+
+### Permission privileges
+
+| Name         | Supports Securable Object | Operation              |
+|--------------|---------------------------|------------------------|
+| ManageGrants | Metalake                  | grant or revoke a role |
+
+### Catalog privileges
+
+| Name          | Supports Securable Object | Operation        |
+|---------------|---------------------------|------------------|
+| CreateCatalog | Metalake                  | Create a catalog |
+| UseCatalog    | Metalake, Catalog         |                  |
+
+:::info
+
+`USE_CATALOG` is needed for a user to interact with any object within the 
catalog. 
+
+For example, to select data from a table, users need to have the SELECT_TABLE 
privilege on that table and
+`USE CATALOG` privileges on its parent catalog as well as `USE SCHEMA` 
privileges on its parent schema.
+
+:::
+
+### Schema privileges
+
+| Name         | Supports Securable Object | Operation       |
+|--------------|---------------------------|-----------------|
+| CreateSchema | Metalake, Catalog         | Create a schema |
+| UseSchema    | Metalake, Catalog, Schema | Use a schema    |
+
+:::info
+
+`UseSchema`is needed for a user to interact with any object within the schema. 
+
+For example, to select data from a table, users need to have the 
`SELECT_TABLE` privilege on that table
+and `USE SCHEMA` privileges on its parent schema.
+
+:::
+
+### Table privileges
+
+| Name        | Supports Securable Object         | Operation                  
                    |
+|-------------|-----------------------------------|------------------------------------------------|
+| CreateTable | Metalake, Catalog, Schema         | Create a table             
                    |
+| ModifyTable | Metalake, Catalog, Schema, Table  | Use the SQL 
`UPDATE`,`DELETE`,`INSERT` a table |
+| SelectTable | Metalake, Catalog, Schema, Table  | Use the SQL `SELECT` data 
from a table         |
+
+### Topic privileges
+
+| Name         | Supports Securable Object        | Operation                  
               |
+|--------------|----------------------------------|-------------------------------------------|
+| CreateTopic  | Metalake, Catalog, Schema        | Create a topic             
               |
+| ProduceTopic | Metalake, Catalog, Schema, Topic | Produce a topic (including 
alter a topic) |
+| ConsumeTopic | Metalake, Catalog, Schema, Topic | Consume a topic            
               |
+
+### Fileset privileges
+
+| Name          | Supports Securable Object          | Operation               
                    |
+|---------------|------------------------------------|---------------------------------------------|
+| CreateFileset | Metalake, Catalog, Schema          | Create a fileset        
                    |
+| WriteFileset  | Metalake, Catalog, Schema, Fileset | Write a fileset 
(including alter a fileset) |
+| ReadFileset   | Metalake, Catalog, Schema, Fileset | read a fileset          
                    |
+
+## Inheritance Model
+
+Securable objects in Gravitino are hierarchical and privileges are inherited 
downward.
+
+This means that granting a privilege on a metalake, catalog or schema 
automatically grants
+the privilege to all current and future objects within the metalake, catalog 
or schema.
+
+For example, if you give a use that `SELECT_TABLE` privilege on a catalog, 
then that the user
+will be able to select(read) all tables in that catalog.
+
+## Privilege Condition
+
+The privilege supports two condition: `allow` and `deny`. `allow` means that 
you are able to use the privilege,
+`deny` means that you aren't able to use the privilege.
+`deny` condition is prior to `allow` condition. If a role has the `allow` 
condition and `deny` condition at the same time. 
+The user won't be able to use the privilege.
+
+If parent securable object has the same privilege name with different 
condition, the securable object won't override the parent object privilege.
+For example, securable metalake object allows to use the catalog, but 
securable catalog denies to use the catalog, the user isn't able to use the 
catalog.
+If securable metalake object denies to use the catalog, but securable catalog 
allows to use the catalog, the user isn't able to use the catalog, too.
+
+![privilege_image](../assets/privilege.png)
+
+## Server Configuration
+
+If you want to enable the access control, you should enable the authorization.
+
+The related configuration is as follows.
+
+| Configuration item                       | Description                       
                                     | Default value | Required                 
        | Since Version |
+|------------------------------------------|------------------------------------------------------------------------|---------------|----------------------------------|---------------|
+| `gravitino.authorization.enable`         | Whether Gravitino enable 
authorization or not.                         | false         | No              
                 | 0.5.0         |
+| `gravitino.authorization.serviceAdmins`  | The admins of Gravitino service, 
Multiple admins are spitted by comma. | (none)        | Yes if enables the 
authorization | 0.5.0         |
+
+
+## User Operation
+
+### Add a user
+
+You should add the user to your metalake before you use the authorization.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X POST -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+  "name": "user1",
+}' http://localhost:8090/api/metalakes/test/users
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+User user =
+    client.addUser("user1");
+```
+
+</TabItem>
+</Tabs>
+
+### Get a user
+
+You can get a user by its name.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" 
http://localhost:8090/api/metalakes/test/users/user1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+User user =
+    client.getUser("user1");
+```
+
+</TabItem>
+</Tabs>
+
+### Delete a user
+
+You can delete a user by its name.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X DELETE -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" 
http://localhost:8090/api/metalakes/test/users/user1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+boolean deleted =
+    client.deleteUser("user1");
+```
+
+</TabItem>
+</Tabs>
+
+## Group Operation
+
+### Add a Group
+
+You should add the group to your metalake before you use the authorization.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X POST -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+  "name": "group1",
+}' http://localhost:8090/api/metalakes/test/groups
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+Group group =
+    client.addGroup("group1");
+```
+
+</TabItem>
+</Tabs>
+
+### Get a group
+
+You can get a group by its name.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" 
http://localhost:8090/api/metalakes/test/groups/group1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+Group group =
+    client.getGroup("group1");
+```
+
+</TabItem>
+</Tabs>
+
+### Delete a group
+
+You can delete a group by its name.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X DELETE -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" 
http://localhost:8090/api/metalakes/test/groups/group1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+boolean deleted =
+    client.deleteGroup("group1");
+```
+
+</TabItem>
+</Tabs>
+
+## Role Operation
+
+### Create a role
+
+You can create a role by given properties.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X POST -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+   "name": "role1",
+   "properties": {"k1", "v1"}
+   "securableObjects": [
+          {
+             "fullName": "catalog1.schema1.table1",
+             "type": "TABLE",
+             "privileges": [
+                    {
+                         "name": "SELECT_TABLE",
+                         "condition": "ALLOW"
+                    }
+             ]    
+          }
+   ]
+}' http://localhost:8090/api/metalakes/test/roles
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+
+SecurableObject securableObject =
+    SecurableObjects.ofTable(
+        SecurableObjects.ofSchema(
+            SecurableObjects.ofCatalog("catalog1", Collections.emptyList()),
+            "schema1",
+            Collections.emptyList()),
+        "table1",
+        Lists.newArrayList(Privileges.SelectTable.allow()));
+      
+Role role =
+    client.createRole("role1", ImmutableMap.of("k1", "v1"), 
Lists.newArrayList(securableObject));
+```
+
+</TabItem>
+</Tabs>
+
+### Get a role
+
+You can get a role by its name.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d 
http://localhost:8090/api/metalakes/test/roles/role1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+Role role =
+    client.getRole("role1");
+```
+
+</TabItem>
+</Tabs>
+
+### Delete a role
+
+You can delete a role by its name.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X DELETE -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" 
http://localhost:8090/api/metalakes/test/roles/role1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+boolean deleted =
+    client.deleteRole("role1");
+```
+
+</TabItem>
+</Tabs>
+
+## Permission Operation
+
+### Grant roles to a user
+
+You can grant specific roles to a user.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+    "roleNames": ["role1"]
+}'http://localhost:8090/api/metalakes/test/permissions/users/user1/grant
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+User user = client.grantRolesToUser(Lists.newList("role1"), "user1");
+```
+
+</TabItem>
+</Tabs>
+
+### Revoke roles from a user
+
+You can revoke specific roles from a user.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+    "roleNames": ["role1"]
+}'http://localhost:8090/api/metalakes/test/permissions/users/user1/revoke
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+User user = client.revokeRolesFromUser(Lists.newList("role1"), "user1");
+```
+
+</TabItem>
+</Tabs>
+
+
+### Grant roles to a group
+
+You can grant specific roles to a group.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+    "roleNames": ["role1"]
+}'http://localhost:8090/api/metalakes/test/permissions/groups/group1/grant
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+Group group = client.grantRolesToGroup(Lists.newList("role1"), "group1");
+```
+
+</TabItem>
+</Tabs>
+
+### Revoke roles from a group
+
+You can revoke specific roles from a group.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+    "roleNames": ["role1"]
+}'http://localhost:8090/api/metalakes/test/permissions/groups/group1/revoke
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+Group group = client.grantRolesToGroup(Lists.newList("role1"), "group1");
+```
+
+</TabItem>
+</Tabs>
+
+## Ownership Operation
+
+### get the owner
+
+You can get the owner of a metadata object.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" 
http://localhost:8090/api/metalakes/test/owners/table/catalog1.schema1.table1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+
+MetadataObject table =
+        MetadataObjects.of(Lists.newArrayList("catalog1", "schema1", 
"table1"), MetadataObject.Type.TABLE);        
+
+Owner owner = client.getOwner(table);
+```
+
+</TabItem>
+</Tabs>
+
+### set the owner
+
+You can set the owner of a metadata object.
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+    "name": "user1",
+    "type": "USER"
+}'http://localhost:8090/api/metalakes/test/owners/table/catalog1.schema1.table1
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+GravitinoClient client = ...
+
+MetadataObject table =
+        MetadataObjects.of(Lists.newArrayList("catalog1", "schema1", 
"table1"), MetadataObject.Type.TABLE);        
+
+client.setOwner(table, "user1", "USER");
+```
+
+</TabItem>
+</Tabs>
+
+## Example
+
+You can follow the steps to achieve the authorization of Gravitino.
+
+![concept_workflow_image](../assets/workflow.png)
+
+1. Service admin configures the Gravitino server to enable authorization and 
creates a metalake.
+
+2. Service admin adds the user `Manager` to the metalake.
+
+3. Service admin sets the `Manager` as the owner of the metalake.
+
+4. `Manager` adds the user `Staff`.
+
+5. `Manager` creates a specific role `catalog_manager` with `CREATE_CATALOG` 
privilege.
+
+6. `Manager` grants the role `catalog_manager` to the user `Staff`.
+
+7. `Staff` creates a Hive type catalog.
+
+8. `Staff` creates a schema `hive_db` for Hive catalog.
+
+9. `Staff` creates a table `hive_table` under the schema `hive_db`.
+
+10. `Staff` creates a MySQL type catalog.
+
+11. `Staff` creates a schema `mysql_db` for MySQL catalog.
+
+12. `Staff` creates a table `mysql_table` under the schema `mysql_db`.
+
+13. `Staff` can use Gravitino connector to query the tables from different 
catalogs.
diff --git a/docs/security/how-to-authenticate.md 
b/docs/security/how-to-authenticate.md
new file mode 100644
index 000000000..a18421807
--- /dev/null
+++ b/docs/security/how-to-authenticate.md
@@ -0,0 +1,174 @@
+---
+title: "How to authenticate"
+slug: /security/how-to-authenticate
+keyword: security authentication oauth kerberos
+license: "This software is licensed under the Apache License version 2."
+---
+
+## Authentication
+
+Apache Gravitino supports three kinds of authentication mechanisms: simple, 
OAuth and Kerberos.
+If you don't enable authentication for your client and server explicitly, you 
will use anonymous to access the server.
+
+### Simple mode
+
+If the client sets the simple mode,  it will use the environment variable 
`GRAVITINO_USER` as the user.
+
+If the environment variable `GRAVITINO_USER` in the client isn't set, the 
client uses the user logging in the machine that sends requests.
+
+For the client side, users can enable `simple` mode by the following code:
+
+```java
+GravitinoClient client = GravitinoClient.builder(uri)
+    .withMetalake("metalake")
+    .withSimpleAuth()
+    .build();
+```
+
+### OAuth mode
+
+Gravitino only supports external OAuth 2.0 servers.
+
+First, users need to guarantee that the external correctly configured OAuth 
2.0 server supports Bearer JWT.
+
+Then, on the server side, users should set `gravitino.authenticators` as 
`oauth` and give
+`gravitino.authenticator.oauth.defaultSignKey`, 
`gravitino.authenticator.oauth.serverUri` and
+`gravitino.authenticator.oauth.tokenPath`  a proper value.
+
+Next, for the client side, users can enable `OAuth` mode by the following code:
+
+```java
+DefaultOAuth2TokenProvider authDataProvider = 
DefaultOAuth2TokenProvider.builder()
+    .withUri("oauth server uri")
+    .withCredential("yy:xx")
+    .withPath("oauth/token")
+    .withScope("test")
+    .build();
+
+GravitinoClient client = GravitinoClient.builder(uri)
+    .withMetalake("metalake")
+    .withOAuth(authDataProvider)
+    .build();
+```
+
+### Kerberos mode
+
+Gravitino supports Kerberos mode.
+
+For the server side, users should set `gravitino.authenticators` as `kerberos` 
and give
+`gravitino.authenticator.kerberos.principal` and 
`gravitino.authenticator.kerberos.keytab` a proper value.
+
+For the client side, users can enable `kerberos` mode by the following code:
+
+```java
+// Use keytab to create KerberosTokenProvider
+KerberosTokenProvider provider = KerberosTokenProvider.builder()
+        .withClientPrincipal(clientPrincipal)
+        .withKeyTabFile(new File(keytabFile))
+        .build();
+
+// Use ticketCache to create KerberosTokenProvider
+KerberosTokenProvider provider = KerberosTokenProvider.builder()
+        .withClientPrincipal(clientPrincipal)
+        .build();        
+
+GravitinoClient client = GravitinoClient.builder(uri)
+    .withMetalake("metalake")
+    .withKerberosAuth(provider)
+    .build();
+```
+
+:::info
+Now Iceberg REST service doesn't support Kerberos authentication.
+The URI must use the hostname of server instead of IP.
+:::
+
+### Server configuration
+
+| Configuration item                                | Description              
                                                                                
                                                                                
                                                                  | Default 
value     | Required                                   | Since version |
+|---------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|--------------------------------------------|---------------|
+| `gravitino.authenticator`                         | It is deprecated since 
Gravitino 0.6.0. Please use `gravitino.authenticators` instead.                 
                                                                                
                                                                    | `simple`  
        | No                                         | 0.3.0         |
+| `gravitino.authenticators`                        | The authenticators which 
Gravitino uses, setting as `simple`,`oauth` or `kerberos`. Multiple 
authenticators are separated by commas. If a request is supported by multiple 
authenticators simultaneously, the first authenticator will be used by default. 
| `simple`          | No                                         | 0.6.0        
 |
+| `gravitino.authenticator.oauth.serviceAudience`   | The audience name when 
Gravitino uses OAuth as the authenticator.                                      
                                                                                
                                                                    | 
`GravitinoServer` | No                                         | 0.3.0         |
+| `gravitino.authenticator.oauth.allowSkewSecs`     | The JWT allows skew 
seconds when Gravitino uses OAuth as the authenticator.                         
                                                                                
                                                                       | `0`    
           | No                                         | 0.3.0         |
+| `gravitino.authenticator.oauth.defaultSignKey`    | The signing key of JWT 
when Gravitino uses OAuth as the authenticator.                                 
                                                                                
                                                                    | (none)    
        | Yes if use `oauth` as the authenticator    | 0.3.0         |
+| `gravitino.authenticator.oauth.signAlgorithmType` | The signature algorithm 
when Gravitino uses OAuth as the authenticator.                                 
                                                                                
                                                                   | `RS256`    
       | No                                         | 0.3.0         |
+| `gravitino.authenticator.oauth.serverUri`         | The URI of the default 
OAuth server.                                                                   
                                                                                
                                                                    | (none)    
        | Yes if use `oauth` as the authenticator    | 0.3.0         |
+| `gravitino.authenticator.oauth.tokenPath`         | The path for token of 
the default OAuth server.                                                       
                                                                                
                                                                     | (none)   
         | Yes if use `oauth` as the authenticator    | 0.3.0         |
+| `gravitino.authenticator.kerberos.principal`      | Indicates the Kerberos 
principal to be used for HTTP endpoint. Principal should start with `HTTP/`.    
                                                                                
                                                                    | (none)    
        | Yes if use `kerberos` as the authenticator | 0.4.0         |
+| `gravitino.authenticator.kerberos.keytab`         | Location of the keytab 
file with the credentials for the principal.                                    
                                                                                
                                                                    | (none)    
        | Yes if use `kerberos` as the authenticator | 0.4.0         |
+
+The signature algorithms that Gravitino supports follows:
+
+| Name  | Description                                    |
+|-------|------------------------------------------------|
+| HS256 | HMAC using SHA-25A                             |
+| HS384 | HMAC using SHA-384                             |
+| HS512 | HMAC using SHA-51                              |
+| RS256 | RSASSA-PKCS-v1_5 using SHA-256                 |
+| RS384 | RSASSA-PKCS-v1_5 using SHA-384                 |
+| RS512 | RSASSA-PKCS-v1_5 using SHA-512                 |
+| ES256 | ECDSA using P-256 and SHA-256                  |
+| ES384 | ECDSA using P-384 and SHA-384                  |
+| ES512 | ECDSA using P-521 and SHA-512                  |
+| PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 |
+| PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 |
+| PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 |
+
+### Example
+
+You can follow the steps to set up an OAuth mode Gravitino server.
+
+1. Prerequisite
+
+   You need to install the JDK8 and Docker.
+
+2. Set up an external OAuth 2.0 server
+
+   There is a sample-authorization-server based on 
[spring-authorization-server](https://github.com/spring-projects/spring-authorization-server/tree/1.0.3).
+
+   The image has registered client information in the external OAuth 2.0 
server.
+
+   Its clientId is `test`. Its secret is `test`. Its scope is `test`.
+
+```shell
+ docker run -p 8177:8177 --name sample-auth-server -d 
datastrato/sample-authorization-server:0.3.0
+```
+
+3. Open [the JWK URL of the Authorization 
server](http://localhost:8177/oauth2/jwks) in the browser and you can get the 
JWK.
+
+   ![jks_response_image](assets/jks.png)
+
+4. Convert the JWK to PEM. You can use the [online 
tool](https://8gwifi.org/jwkconvertfunctions.jsp#google_vignette) or other 
tools.
+
+   ![pem_convert_result_image](assets/pem.png)
+
+5. Copy the public key and remove the character `\n` and you can get the 
default signing key of Gravitino server.
+
+6. You can refer to the [Configurations](gravitino-server-config.md) and 
append the configurations to the conf/gravitino.conf.
+
+```text
+gravitino.authenticators = oauth
+gravitino.authenticator.oauth.serviceAudience = test
+gravitino.authenticator.oauth.defaultSignKey = <the default signing key>
+gravitino.authenticator.oauth.tokenPath = /oauth2/token
+gravitino.authenticator.oauth.serverUri = http://localhost:8177
+```
+
+7. Open [the URL of Gravitino server](http://localhost:8090) and login in with 
clientId `test`, clientSecret `test`, and scope `test`.
+
+   ![oauth_login_image](assets/oauth.png)
+
+8. You can also use the curl command to access Gravitino.
+
+Get access token
+
+```shell
+curl --location --request POST 
'http://127.0.0.1:8177/oauth2/token?grant_type=client_credentials&client_id=test&client_secret=test&scope=test'
+```
+
+Use the access token to request the Gravitino
+
+```shell
+curl -v -X GET -H "Accept: application/vnd.gravitino.v1+json" -H 
"Content-Type: application/json" -H "Authorization: Bearer <access_token>" 
http://localhost:8090/api/version
+```
\ No newline at end of file
diff --git a/docs/security/how-to-use-cors.md b/docs/security/how-to-use-cors.md
new file mode 100644
index 000000000..c124a021e
--- /dev/null
+++ b/docs/security/how-to-use-cors.md
@@ -0,0 +1,36 @@
+---
+title: "How to use CORS"
+slug: /security/how-use-cors
+keyword: security cors
+license: "This software is licensed under the Apache License version 2."
+---
+
+## Cross-origin resource filter
+
+### Server configuration
+
+| Configuration item                                 | Description             
                                                                                
                                                                                
                                               | Default value                  
               | Required | Since version |
+|----------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|----------|---------------|
+| `gravitino.server.webserver.enableCorsFilter`      | Enable cross-origin 
resource share filter.                                                          
                                                                                
                                                   | false                      
                   | No       | 0.4.0         |
+| `gravitino.server.webserver.allowedOrigins`        | A comma separated list 
of allowed origins to access the resources. The default value is *, which means 
all origins.                                                                    
                                                | `*`                           
                | No       | 0.4.0         |
+| `gravitino.server.webserver.allowedTimingOrigins`  | A comma separated list 
of allowed origins to time the resource. The default value is the empty string, 
which means no origins.                                                         
                                                | ``                            
                | No       | 0.4.0         |
+| `gravitino.server.webserver.allowedMethods`        | A comma separated list 
of allowed HTTP methods used when accessing the resources. The default values 
are GET, POST, HEAD, and DELETE.                                                
                                                  | `GET,POST,HEAD,DELETE,PUT`  
                  | No       | 0.4.0         |
+| `gravitino.server.webserver.allowedHeaders`        | A comma separated list 
of allowed HTTP headers specified when accessing the resources. The default 
value is X-Requested-With,Content-Type,Accept,Origin. If the value is a single 
*, it accepts all headers.                           | 
`X-Requested-With,Content-Type,Accept,Origin` | No       | 0.4.0         |
+| `gravitino.server.webserver.preflightMaxAgeInSecs` | The number of seconds 
to cache preflight requests by the client. The default value is 1800 seconds or 
30 minutes.                                                                     
                                                 | `1800`                       
                 | No       | 0.4.0         |
+| `gravitino.server.webserver.allowCredentials`      | A boolean indicating if 
the resource allows requests with credentials. The default value is true.       
                                                                                
                                               | `true`                         
               | No       | 0.4.0         |
+| `gravitino.server.webserver.exposedHeaders`        | A comma separated list 
of allowed HTTP headers exposed on the client. The default value is the empty 
list.                                                                           
                                                  | ``                          
                  | No       | 0.4.0         |
+| `gravitino.server.webserver.chainPreflight`        | If true chained 
preflight requests for normal handling (as an OPTION request). Otherwise, the 
filter responds to the preflight. The default is true.                          
                                                         | `true`               
                         | No       | 0.4.0         |
+
+### Apache Iceberg REST service's configuration
+
+| Configuration item                             | Description                 
                                                                                
                                                                                
                 | Default value                                 | Required | 
Since version |
+|------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|----------|---------------|
+| `gravitino.iceberg-rest.enableCorsFilter`      | Enable cross-origin 
resource share filter.                                                          
                                                                                
                         | false                                         | No   
    | 0.4.0         |
+| `gravitino.iceberg-rest.allowedOrigins`        | A comma separated list of 
allowed origins that access the resources. The default value is *, which means 
all origins.                                                                    
                    | `*`                                           | No       
| 0.4.0         |
+| `gravitino.iceberg-rest.allowedTimingOrigins`  | A comma separated list of 
allowed origins that time the resource. The default value is the empty string, 
which means no origins.                                                         
                    | ``                                            | No       
| 0.4.0         |
+| `gravitino.iceberg-rest.allowedMethods`        | A comma separated list of 
allowed HTTP methods used when accessing the resources. The default values are 
GET, POST, HEAD, and DELETE.                                                    
                    | `GET,POST,HEAD,DELETE,PUT`                    | No       
| 0.4.0         |
+| `gravitino.iceberg-rest.allowedHeaders`        | A comma separated list of 
HTTP allowed headers specified when accessing the resources. The default value 
is X-Requested-With,Content-Type,Accept,Origin. If the value is a single *, it 
accepts all headers. | `X-Requested-With,Content-Type,Accept,Origin` | No       
| 0.4.0         |
+| `gravitino.iceberg-rest.preflightMaxAgeInSecs` | The number of seconds to 
cache preflight requests by the client. The default value is 1800 seconds or 30 
minutes.                                                                        
                    | `1800`                                        | No       
| 0.4.0         |
+| `gravitino.iceberg-rest.allowCredentials`      | A boolean indicating if the 
resource allows requests with credentials. The default value is true.           
                                                                                
                 | `true`                                        | No       | 
0.4.0         |
+| `gravitino.iceberg-rest.exposedHeaders`        | A comma separated list of 
allowed HTTP headers exposed on the client. The default value is the empty 
list.                                                                           
                        | ``                                            | No    
   | 0.4.0         |
+| `gravitino.iceberg-rest.chainPreflight`        | If true chained preflight 
requests for normal handling (as an OPTION request). Otherwise, the filter 
responds to the preflight. The default is true.                                 
                        | `true`                                        | No    
   | 0.4.0         |
diff --git a/docs/security/how-to-use-https.md 
b/docs/security/how-to-use-https.md
new file mode 100644
index 000000000..ddb7a5532
--- /dev/null
+++ b/docs/security/how-to-use-https.md
@@ -0,0 +1,127 @@
+---
+title: "How to use HTTPS"
+slug: /security/how-to-use-https
+keyword: security HTTPS protocol
+license: "This software is licensed under the Apache License version 2."
+---
+
+## HTTPS
+
+Users would better use HTTPS instead of HTTP if users choose OAuth 2.0 as the 
authenticator.
+
+HTTPS protects the header of the request from smuggling, making it safer.
+
+If users choose to enable HTTPS, Gravitino won't provide the ability of HTTP 
service.
+
+Both the Gravitino server and Iceberg REST service can configure HTTPS.
+
+### Apache Gravitino server's configuration
+
+| Configuration item                                  | Description            
                                            | Default value | Required          
                                | Since version |
+|-----------------------------------------------------|--------------------------------------------------------------------|---------------|---------------------------------------------------|---------------|
+| `gravitino.server.webserver.enableHttps`            | Enables HTTPS.         
                                            | `false`       | No                
                                | 0.3.0         |
+| `gravitino.server.webserver.httpsPort`              | The HTTPS port number 
of the Jetty web server.                     | `8433`        | No               
                                 | 0.3.0         |
+| `gravitino.server.webserver.keyStorePath`           | Path to the key store 
file.                                        | (none)        | Yes if use HTTPS 
                                 | 0.3.0         |
+| `gravitino.server.webserver.keyStorePassword`       | Password to the key 
store.                                         | (none)        | Yes if use 
HTTPS                                  | 0.3.0         |
+| `gravitino.server.webserver.keyStoreType`           | The type to the key 
store.                                         | `JKS`         | No             
                                   | 0.3.0         |
+| `gravitino.server.webserver.managerPassword`        | Manager password to 
the key store.                                 | (none)        | Yes if use 
HTTPS                                  | 0.3.0         |
+| `gravitino.server.webserver.tlsProtocol`            | TLS protocol to use. 
The JVM must support the TLS protocol to use. | (none)        | No              
                                  | 0.3.0         |
+| `gravitino.server.webserver.enableCipherAlgorithms` | The collection of 
enabled cipher algorithms.                       | ``            | No           
                                     | 0.3.0         |
+| `gravitino.server.webserver.enableClientAuth`       | Enables the 
authentication of the client.                          | `false`       | No     
                                           | 0.3.0         |
+| `gravitino.server.webserver.trustStorePath`         | Path to the trust 
store file.                                      | (none)        | Yes if use 
HTTPS and the authentication of client | 0.3.0         |
+| `gravitino.server.webserver.trustStorePassword`     | Password to the trust 
store.                                       | (none)        | Yes if use HTTPS 
and the authentication of client | 0.3.0         |
+| `gravitino.server.webserver.trustStoreType`         | The type to the trust 
store.                                       | `JKS`         | No               
                                 | 0.3.0         |
+
+### Apache Iceberg REST service's configuration
+
+| Configuration item                              | Description                
                                        | Default value | Required              
                            | Since version |
+|-------------------------------------------------|--------------------------------------------------------------------|---------------|---------------------------------------------------|---------------|
+| `gravitino.iceberg-rest.enableHttps`            | Enables HTTPS.             
                                        | `false`       | No                    
                            | 0.3.0         |
+| `gravitino.iceberg-rest.httpsPort`              | The HTTPS port number of 
the Jetty web server.                     | `9433`        | No                  
                              | 0.3.0         |
+| `gravitino.iceberg-rest.keyStorePath`           | Path to the key store 
file.                                        | (none)        | Yes if use HTTPS 
                                 | 0.3.0         |
+| `gravitino.iceberg-rest.keyStorePassword`       | Password to the key store. 
                                        | (none)        | Yes if use HTTPS      
                            | 0.3.0         |
+| `gravitino.iceberg-rest.keyStoreType`           | The type to the key store. 
                                        | `JKS`         | No                    
                            | 0.3.0         |
+| `gravitino.iceberg-rest.managerPassword`        | Manager password to the 
key store.                                 | (none)        | Yes if use HTTPS   
                               | 0.3.0         |
+| `gravitino.iceberg-rest.tlsProtocol`            | TLS protocol to use. The 
JVM must support the TLS protocol to use. | (none)        | No                  
                              | 0.3.0         |
+| `gravitino.iceberg-rest.enableCipherAlgorithms` | The collection of enabled 
cipher algorithms.                       | ``            | No                   
                             | 0.3.0         |
+| `gravitino.iceberg-rest.enableClientAuth`       | Enables the authentication 
of the client.                          | `false`       | No                    
                            | 0.3.0         |
+| `gravitino.iceberg-rest.trustStorePath`         | Path to the trust store 
file.                                      | (none)        | Yes if use HTTPS 
and the authentication of client | 0.3.0         |
+| `gravitino.iceberg-rest.trustStorePassword`     | Password to the trust 
store.                                       | (none)        | Yes if use HTTPS 
and the authentication of client | 0.3.0         |
+| `gravitino.iceberg-rest.trustStoreType`         | The type to the trust 
store.                                       | `JKS`         | No               
                                 | 0.3.0         |
+
+Refer to the "Additional JSSE Standard Names" section of the [Java security 
guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#jssenames)
 for the list of protocols related to tlsProtocol. You can find the list of 
`tlsProtocol` values for Java 8 in this document.
+
+Refer to the "Additional JSSE Standard Names" section of the [Java security 
guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#ciphersuites)
 for the list of protocols related to tlsProtocol. You can find the list of 
`enableCipherAlgorithms` values for Java 8 in this document.
+
+### Example
+
+You can follow the steps to set up an HTTPS server.
+
+1. Prerequisite
+
+   You need to install the JDK8, wget, and set the environment JAVA_HOME.
+
+   If you want to use the command `curl` to request the Gravitino server, you 
should install openSSL.
+
+2. Generate the key store
+
+```shell
+cd $JAVA_HOME
+bin/keytool -genkeypair  -alias localhost \
+-keyalg RSA -keysize 4096 -keypass localhost \
+-sigalg SHA256withRSA \
+-keystore localhost.jks -storetype JKS -storepass localhost \
+-dname "cn=localhost,ou=localhost,o=localhost,l=beijing,st=beijing,c=cn" \
+-validity 36500
+```
+
+3. Generate the certificate
+
+```shell
+bin/keytool -export -alias localhost -keystore localhost.jks -file  
localhost.crt -storepass localhost
+```
+
+4. Import the certificate
+
+```shell
+bin/keytool -import -alias localhost -keystore jre/lib/security/cacerts -file 
localhost.crt -storepass changeit -noprompt
+```
+
+5. You can refer to the [Configurations](gravitino-server-config.md) and 
append the configuration to the conf/gravitino.conf.
+   Configuration doesn't support resolving environment variables, so you 
should replace `${JAVA_HOME}` with the actual value.
+   Then, You can start the Gravitino server.
+
+```text
+gravitino.server.webserver.host = localhost
+gravitino.server.webserver.enableHttps = true
+gravitino.server.webserver.keyStorePath = ${JAVA_HOME}/localhost.jks
+gravitino.server.webserver.keyStorePassword = localhost
+gravitino.server.webserver.managerPassword = localhost
+```
+
+6. Request the Gravitino server
+
+   If you use Java, you can follow the steps
+
+   Copy the code to a file named Main.java
+
+```java
+import org.apache.gravitino.client.GravitinoClient;
+import org.apache.gravitino.client.GravitinoVersion;
+
+public class Main {
+    public static void main(String[] args) {
+        String uri = "https://localhost:8433";;
+        GravitinoClient client = 
GravitinoClient.builder(uri).withMetalake("metalake").build();
+        GravitinoVersion gravitinoVersion = client.getVersion();
+        System.out.println(gravitinoVersion);
+    }
+}
+```
+
+If you want to use the command `curl`, you can follow the commands:
+
+```shell
+openssl x509 -inform der -in $JAVA_HOME/localhost.crt -out certificate.pem
+curl -v -X GET --cacert ./certificate.pem -H "Accept: 
application/vnd.gravitino.v1+json" -H "Content-Type: application/json" 
https://localhost:8433/api/version
+```
diff --git a/docs/security/security.md b/docs/security/security.md
new file mode 100644
index 000000000..e09aab701
--- /dev/null
+++ b/docs/security/security.md
@@ -0,0 +1,20 @@
+---
+title: "Security"
+slug: /security/security
+keyword: security
+license: "This software is licensed under the Apache License version 2."
+---
+
+## Overview
+
+Gravitino provides features that ensure the highest levels of security for you.
+
+## Capabilities
+
+### Supports [Authentication](how-to-authenticate.md)
+
+### Supports [HTTPS](how-to-use-https.md)
+
+### Supports [Access Control](access-control.md)
+
+### Supports [CORS](how-to-use-cors.md)
\ No newline at end of file
diff --git a/docs/webui.md b/docs/webui.md
index 1fd7ef6b9..3a1742340 100644
--- a/docs/webui.md
+++ b/docs/webui.md
@@ -10,13 +10,13 @@ license: 'This software is licensed under the Apache 
License version 2.'
 
 This document primarily outlines how users can manage metadata within Apache 
Gravitino using the web UI, the graphical interface is accessible through a web 
browser as an alternative to writing code or using the REST interface.
 
-Currently, you can integrate [OAuth settings](./security.md) to view, add, 
modify, and delete metalakes, create catalogs, and view catalogs, schemas, and 
tables, among other functions.
+Currently, you can integrate [OAuth settings](security/security.md) to view, 
add, modify, and delete metalakes, create catalogs, and view catalogs, schemas, 
and tables, among other functions.
 
 [Build](./how-to-build.md#quick-start) and 
[deploy](./getting-started.md#getting-started-locally) the Gravitino Web UI and 
open it in a browser at `http://<gravitino-host>:<gravitino-port>`, by default 
is [http://localhost:8090](http://localhost:8090).
 
 ## Initial page
 
-The web UI homepage displayed in Gravitino depends on the configuration 
parameter for OAuth mode, see the details in [Security](./security.md).
+The web UI homepage displayed in Gravitino depends on the configuration 
parameter for OAuth mode, see the details in [Security](security/security.md).
 
 Set parameter for `gravitino.authenticators`, [`simple`](#simple-mode) or 
[`oauth`](#oauth-mode). Simple mode is the default authentication option. If 
multiple authenticators are set, the first one is taken by default.
 
@@ -57,7 +57,7 @@ Such as Safari need to enable the developer menu, and select 
`Disable Cross-Orig
 
 ![webui-login-with-oauth](./assets/webui/login-with-oauth.png)
 
-1. Enter the values corresponding to your specific configuration. For detailed 
instructions, please refer to [Security](./security.md).
+1. Enter the values corresponding to your specific configuration. For detailed 
instructions, please refer to [Security](security/security.md).
 
 2. Clicking on the `LOGIN` button takes you to the homepage.
 

Reply via email to