mirror of
https://github.com/apache/superset.git
synced 2026-04-19 08:04:53 +00:00
feat: Trino Authentications (#17593)
* feat: support Trino Authentications Signed-off-by: Đặng Minh Dũng <dungdm93@live.com> * docs: Trino Authentications Signed-off-by: Đặng Minh Dũng <dungdm93@live.com>
This commit is contained in:
@@ -1273,6 +1273,26 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods
|
||||
raise ex
|
||||
return extra
|
||||
|
||||
@staticmethod
|
||||
def update_encrypted_extra_params(
|
||||
database: "Database", params: Dict[str, Any]
|
||||
) -> None:
|
||||
"""
|
||||
Some databases require some sensitive information which do not conform to
|
||||
the username:password syntax normally used by SQLAlchemy.
|
||||
|
||||
:param database: database instance from which to extract extras
|
||||
:param params: params to be updated
|
||||
"""
|
||||
if not database.encrypted_extra:
|
||||
return
|
||||
try:
|
||||
encrypted_extra = json.loads(database.encrypted_extra)
|
||||
params.update(encrypted_extra)
|
||||
except json.JSONDecodeError as ex:
|
||||
logger.error(ex, exc_info=True)
|
||||
raise ex
|
||||
|
||||
@classmethod
|
||||
def is_readonly_query(cls, parsed_query: ParsedQuery) -> bool:
|
||||
"""Pessimistic readonly, 100% sure statement won't mutate anything"""
|
||||
|
||||
@@ -14,11 +14,13 @@
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional, TYPE_CHECKING
|
||||
from urllib import parse
|
||||
|
||||
import simplejson as json
|
||||
from flask import current_app
|
||||
from sqlalchemy.engine.url import make_url, URL
|
||||
|
||||
from superset.db_engine_specs.base import BaseEngineSpec
|
||||
@@ -27,6 +29,8 @@ from superset.utils import core as utils
|
||||
if TYPE_CHECKING:
|
||||
from superset.models.core import Database
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TrinoEngineSpec(BaseEngineSpec):
|
||||
engine = "trino"
|
||||
@@ -202,3 +206,42 @@ class TrinoEngineSpec(BaseEngineSpec):
|
||||
connect_args["verify"] = utils.create_ssl_cert_file(database.server_cert)
|
||||
|
||||
return extra
|
||||
|
||||
@staticmethod
|
||||
def update_encrypted_extra_params(
|
||||
database: "Database", params: Dict[str, Any]
|
||||
) -> None:
|
||||
if not database.encrypted_extra:
|
||||
return
|
||||
try:
|
||||
encrypted_extra = json.loads(database.encrypted_extra)
|
||||
auth_method = encrypted_extra.pop("auth_method", None)
|
||||
auth_params = encrypted_extra.pop("auth_params", {})
|
||||
if not auth_method:
|
||||
return
|
||||
|
||||
connect_args = params.setdefault("connect_args", {})
|
||||
connect_args["http_scheme"] = "https"
|
||||
# pylint: disable=import-outside-toplevel
|
||||
if auth_method == "basic":
|
||||
from trino.auth import BasicAuthentication as trino_auth # noqa
|
||||
elif auth_method == "kerberos":
|
||||
from trino.auth import KerberosAuthentication as trino_auth # noqa
|
||||
elif auth_method == "jwt":
|
||||
from trino.auth import JWTAuthentication as trino_auth # noqa
|
||||
else:
|
||||
allowed_extra_auths = current_app.config[
|
||||
"ALLOWED_EXTRA_AUTHENTICATIONS"
|
||||
].get("trino", {})
|
||||
if auth_method in allowed_extra_auths:
|
||||
trino_auth = allowed_extra_auths.get(auth_method)
|
||||
else:
|
||||
raise ValueError(
|
||||
f"For security reason, custom authentication '{auth_method}' "
|
||||
f"must be listed in 'ALLOWED_EXTRA_AUTHENTICATIONS' config"
|
||||
)
|
||||
|
||||
connect_args["auth"] = trino_auth(**auth_params)
|
||||
except json.JSONDecodeError as ex:
|
||||
logger.error(ex, exc_info=True)
|
||||
raise ex
|
||||
|
||||
Reference in New Issue
Block a user