Jak zabezpečit Nadmnožinou '/login/' endpoint

0

Otázka

Nedávno jsem integrovaného nadmnožinou s mým webové aplikace tak, že když uživatele, který je ověřen moje webová aplikace může vstoupit nadřazený a zobrazit/editovat/vytvářet dashboardy založené na jejich roli jen kliknutím na odkaz není třeba ani přihlášení. Za tohle jsem musel obejít přihlášení, pro které jsem podle tohoto článku.

Vlastní SecurityManager jsem použil obejít přihlášení

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)

Takže podle výše uvedeného kódu pomocí url http://localhost:8088/login?username=John bude přihlášení uživatele John interně, nebo pokud uživatel John neexistuje, je vytvořen účet s rolí, která je založena na roli uživatele v mé webové aplikace

Problém je, že někdo, kdo může odhadnout tuto adresu url http://localhost:8088/login?username=USER_NAME můžete vytvořit svůj účet v superset, tak jak k ochraně nebo zajištění této '/login' endpoint

1

Nejlepší odpověď

0

Můžete použít rozhraní API tak, že jste dont vystavit žádost podrobnosti přes 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

V jiných jazycích

Tato stránka je v jiných jazycích

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