GitHub user gabriel-korbato added a comment to the discussion: How to customize
authentication in version 6
@dosu That worked, albeit with a few changes. Below is an excerpt of my
`superset_config.py` with all the relevant parts.
```
import logging
import requests
import uuid
import io
import json
import os
import threading
import time
from werkzeug.wrappers import Request, Response
from werkzeug.http import parse_cookie
from werkzeug.exceptions import HTTPException
from werkzeug.utils import redirect
from flask_appbuilder.security.manager import AUTH_REMOTE_USER
from superset.security import SupersetSecurityManager
from superset.config import DATA_DIR
from superset.extensions import db # suggested by dosu
from flask import g, request, redirect, abort, session, current_app
from flask import Flask, jsonify
from flask_appbuilder.security.views import AuthRemoteUserView
from flask_appbuilder import expose
from flask_login import login_user
logging.basicConfig(level=logging.INFO)
log = logging.getLogger(__name__)
LOG_LEVEL = logging.INFO
class CustomRemoteUserMiddleware(object):
# sets environment variables REMOTE_USER, FIRST_NAME, LAST_NAME, ROLES
...
def update_user(user, first_name, last_name, roles, security_manager):
# updates a user's first_name, last_name, and roles if they have changed
...
def init_custom_auth(app):
@app.before_request
def ensure_remote_user():
# intercepts requests to set or update user object from environment
variables
if hasattr(g, '_remote_user_checked'):
return
g._remote_user_checked = True
username = request.environ.get("REMOTE_USER")
if not username:
return
first_name = request.environ.get("FIRST_NAME")
last_name = request.environ.get("LAST_NAME")
roles = request.environ.get("ROLES")
# Access security manager directly, not via LocalProxy
sm = app.appbuilder.sm
user = sm.find_user(username=username)
if not user:
# Get gamma role object in a fresh query
gamma_role =
sm.session.query(sm.role_model).filter_by(name="Gamma").first()
log.info(f"Adding new user: {username} for request {request}")
user = sm.add_user(
username=username,
first_name=first_name,
last_name=last_name,
email=username,
role=gamma_role
)
sm.session.commit()
user = sm.find_user(username=username)
if user:
update_user(user, first_name, last_name, roles, sm)
login_user(user)
ADDITIONAL_MIDDLEWARE = [CustomRemoteUserMiddleware]
AUTH_TYPE = AUTH_REMOTE_USER
AUTH_USER_REGISTRATION = False
FLASK_APP_MUTATOR = init_custom_auth
```
It would be great if Superset code contributors who are more experienced in the
security model and how it was changed in version 6 can review this, improve it,
and add it to the documentation.
GitHub link:
https://github.com/apache/superset/discussions/38199#discussioncomment-15905329
----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]