问题描述
我是 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