重用一个系统的凭据登录到另一个系统

时间:2021-01-07 20:00:54

标签: python authentication ldap apache-superset flask-appbuilder

我是 Flask 的新手,我使用的是 0.38.0 版中的 apache-superset。

其中我使用的是 LDAP 身份验证方法,一切正常。

不过我公司有另外一个系统,也是用LDAP登录的,专有系统。这个想法是,当用户登录到我们的系统并准备进入超集时,他已经登录,利用我们系统中使用的凭据,因为两者都使用 LDAP。

到目前为止我发现了什么:显然这是验证 LDAP 凭据的类:

class AuthLDAPView(AuthView):
    login_template = "appbuilder/general/security/login_ldap.html"

    @expose("/login/", methods=["GET", "POST"])
    def login(self):
        if g.user is not None and g.user.is_authenticated:
            return redirect(self.appbuilder.get_url_for_index)
        form = LoginForm_db()
        if form.validate_on_submit():
            user = self.appbuilder.sm.auth_user_ldap(
                form.username.data, form.password.data
            )
            if not user:
                flash(as_unicode("Usuário não Encontrado ou Instabilidade no servidor LDAP"), "warning")
                return redirect(self.appbuilder.get_url_for_login)
            login_user(user, remember=False)
            return redirect(self.appbuilder.get_url_for_index)
        return self.render_template(
            self.login_template, title=self.title, form=form, appbuilder=self.appbuilder
        )

显然是通过 LoginForm_db() 收到的凭据:

class LoginForm_db(DynamicForm):
username = StringField(lazy_gettext("User Name"), validators=[DataRequired()])
password = PasswordField(lazy_gettext("Password"), validators=[DataRequired()])

依次从登录屏幕接收值,该值写在烧瓶中,如下所示:

 <form class="form" action="" method="post" name="login">
    {{form.hidden_tag()}}
    <div class="help-block">{{_("Enter your login and password below")}}:</div>
    <div class="control-group{% if form.errors.openid is defined %} error{% endif %}">
        <label class="control-label" for="openid">{{_("Username")}}:</label>
        <div class="controls">
            <div class="input-group">
            <span class="input-group-addon"><i class="fa fa-user"></i></span>
            {{ form.username(size = 80, class = "form-control", autofocus = true) }}
            </div>
            {% for error in form.errors.get('openid', []) %}
                <span class="help-inline">[{{error}}]</span><br>
            {% endfor %}
    <label class="control-label" for="openid">{{_("Password")}}:</label>
            <div class="input-group">
            <span class="input-group-addon"><i class="fa fa-key"></i></span>
            {{ form.password(size = 80, class = "form-control") }}
            </div>
            {% for error in form.errors.get('openid', []) %}
                <span class="help-inline">[{{error}}]</span><br>
            {% endfor %}
        </div>
    </div>
<div class="control-group">
        <div class="controls">
    <br>
            <input class="btn btn-primary btn-block" type="submit" value="{{_('Logar')}}">
    </div>
</div>
</form>

我正在考虑做一些事情,可以通过 url 发送在我们的专有系统(用 Java 开发)中验证的凭据,并以超集的这种形式接收它们,然后登录。

我几乎可以肯定这不是最安全的方法,但我是编程初学者,想不出更好的方法。也许是令牌,但我什至不知道从哪里开始。

用户登录到另一个系统,(我可以在那里兑换用户和密码),当重定向到超集时,必须自动登录。如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以创建一个 RESTful API 来处理用户身份验证,如下所示

from flask import request, make_response, jsonify, session
from flask_appbuilder.api import BaseApi, expose, rison, safe
from flask_appbuilder.security.decorators import protect

from . import appbuilder
from flask_login import current_user, login_user
from app import db



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']

            user = self.appbuilder.sm.auth_user_db(username, password)
            
            
            if str(user) != "None":
               
              login_user(user, remember=False)
              if current_user.is_active:
               username = current_user.username
               status  = current_user.active
               response = make_response(jsonify({'message': 'Login Success',
                                  'severity': 'info','Username': 
                                                           username,'Status':status}))
        return response

有关如何创建 REST API 的详细信息,请参阅此。 https://flask-appbuilder.readthedocs.io/en/latest/rest_api.html

相关问题