微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决重用一个系统的凭据登录到另一个系统

我是 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 开发)中验证的凭据,并以超集的这种形式接收它们,然后登录

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

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

解决方法

您可以创建一个 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。