Comment sécuriser Superset '/login/ " point de terminaison

0

La question

Récemment, j'ai intégré sur-ensemble avec mon application web de sorte que lorsqu'un utilisateur qui est authentifié par mon application web peut entrer sur-ensemble et de visualiser/éditer/créer des tableaux de bord en fonction de leur rôle, simplement en cliquant sur le lien même pas besoin de connexion. Pour ce faire, je devais contourner le login pour laquelle j'ai renvoyé cet article.

Personnalisé SecurityManager j'ai utilisé pour contourner la connexion

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)

Ainsi, selon le code ci-dessus en utilisant l'url http://localhost:8088/login?username=John se connecte l'utilisateur John en interne ou si l'utilisateur John n'existe pas de compte est créé avec un rôle qui est basée sur le rôle de l'utilisateur dans mon application web

Maintenant, le problème est une personne qui peut deviner cette url http://localhost:8088/login?username=USER_NAME peuvent créer leur compte en superset, alors comment protéger ou assurer cette '/login' point de terminaison

1

La meilleure réponse

0

Vous pouvez utiliser l'API de sorte que vous ne pas exposer les détails de la demande de plus de 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

Dans d'autres langues

Cette page est dans d'autres langues

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