Come proteggere Superset '/login/' endpoint

0

Domanda

Di recente ho integrato in superset con la mia applicazione web, in modo che quando un utente viene autenticato dalla mia applicazione web in grado di entrare in superset e visualizzare/modificare/creare cruscotti in base al proprio ruolo solo cliccando il link senza bisogno di login. Per fare questo ho dovuto bypassare il login per cui ho fatto riferimento in questo articolo.

Personalizzato SecurityManager ho usato per bypassare il login

class CustomAuthDBView(AuthDBView):

    @expose('/login/', methods=['GET', 'POST'])
    def login(self):
        redirect_url = self.appbuilder.get_url_for_index
        user_name = request.args.get('username')
        user_role = request.args.get('role')
        if user_name is not None:
            user = self.appbuilder.sm.find_user(username=user_name)
            if not user:
                role = self.appbuilder.sm.find_role(user_role)
                user = self.appbuilder.sm.add_user(user_name, user_name, 'last_name', user_name + "@domain.com", role, password = "password")
            if user:
                login_user(user, remember=False)
                return redirect(redirect_url)

        else:
            print('Unable to auto login', 'warning')
            return super(CustomAuthDBView,self).login()

class CustomSecurityManager(SupersetSecurityManager):
    authdbview = CustomAuthDBView
    def __init__(self, appbuilder):
        super(CustomSecurityManager, self).__init__(appbuilder)

Quindi, secondo il codice di cui sopra tramite url http://localhost:8088/login?username=John l'utente potrà accedere Giovanni internamente o se l'utente John non esiste account è stato creato con un ruolo che è in base al ruolo dell'utente nella mia applicazione web

Ora il problema è che chiunque può immaginare questo url http://localhost:8088/login?username=USER_NAME può creare il proprio account in superset, così come proteggere o sicuro di questo '/login' endpoint

1

Migliore risposta

0

È possibile utilizzare l'API, in modo che tu non esporre i dettagli della richiesta sopra l'URL.

from flask_appbuilder.api import BaseApi, expose
from . import appbuilder

    class LoginApi(BaseApi):

    resource_name = "login"
    
    @expose('/loginapi/', methods=['GET','POST'])
    #@has_access
    
    def loginapi(self):
        if request.method == 'POST':
            username = request.json['username']
            password = request.json['password']



appbuilder.add_api(LoginApi)
2021-11-24 10:09:07

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................