有没有一种方法可以从不同于安全登录表单的其他表单登录用户

时间:2019-09-21 17:23:23

标签: python flask flask-login flask-security

我有一个使用flask安全性设置的登录页面,一旦用户登录将其重定向到管理页面,现在我想为最终用户(客户)创建另一个登录页面。

我创建了一个将电子邮件和密码发布到flask的表单。烧瓶,然后检查数据库中是否存在电子邮件和密码,然后检查login_user(user)。 jQuery假定使用当前用户ID加载另一个页面,但返回None。

Login.py

@login.route('/userLogin/log',  methods=['GET','POST'])
def Login():
     data = request.get_json()
     email = data["email"]
     passw = data["password"]



     user = UsersModel.query.filter_by(email=email).first()
     if user:
          if verify_password(user.password, passw):

              login_user(user)
              return  jsonify({'message':"done"})
     else: 
          return  jsonify({'message':gettext('Email and Password do not exist')}),422
          return render_template('front/cart.html')

@login.route('/homepage')
def homepage():
     id = "Hello" + str(current_user.get_id())
     return id

初始化 .py

     app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://root:@127.0.0.1/docwhere'
     app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
     #app.config['JWT_AUTH_USERNAME_KEY']='phoneNo'
     #app.config['WTF_CSRF_CHECK_DEFAULT']=False
     app.config['SECURITY_REGISTERABLE'] = False
     app.config['SECURITY_PASSWORD_SALT']='rreer##@'
     app.config['CKEDITOR_FILE_UPLOADER'] = '/admin/upload/'
     app.config['CKEDITOR_FILE_BROWSER']='/fm/index.html'
     app.config['UPLOADED_FILES_DEST'] = '/static/uploads'
     app.secret_key = 'EiEiO##$'
     app.config['FLASKFILEMANAGER_FILE_PATH'] = '/static/uploads'
     app.config['BABEL_DEFAULT_LOCALE']='en'
     app.path = '/static/uploads/'
     app.database_path = '/static/uploads/'
     db.init_app(app)
     class JSONEncoder(BaseEncoder):
          def default(self, o):
                if isinstance(o, _LazyString):
                     return text_type(o)

    return BaseEncoder.default(self, o)

 app.json_encoder = JSONEncoder
 babel = Babel(app)
 csrf = CSRFProtect(app)
 ckeditor = CKEditor(app)

 login_manager = LoginManager()
 login_manager.init_app(app)

 security = Security(app, user_datastore)

更新:jQuery提交按钮

  $('#login').click(function(e){
  e.preventDefault();
  url = "/userLogin/log "
  var csrf_token = "%% csrf_token() %%";
   var ob = {"email": $("#login-user").val(),
      "password": $('#login-pass').val()
    };      
  console.log(ob);
   $.ajax({
              url: url,
              type: 'post',
              headers: {
                  "Content-Type": "application/json",
                  "X-CSRFToken": csrf_token,
              },
              traditional: true,
              data: JSON.stringify(ob),

              success: function (message) {

                window.location.replace("%%  

           url_for('login.homepage')%%%%process_query_string(request)%%");

                },
        error: function (err) {

            error = "";
            $(".btn").removeAttr("disabled");
            for (key in err.responseJSON) {
                error +=  key + ":" + err.responseJSON[key] + "<br>";
            }
            if (error)
                $("#error").html("<p>" + error + "</p>");
            else
                $("#error").html("<p>" + err.responseText + "</p>");
            $("#error").show();
        }


     });
    return false;
     });

1 个答案:

答案 0 :(得分:0)

您想做的事很好。没有足够的调试信息来知道问题可能在哪里。您有可能在CSRF时被停止(我通常不使用CSRF而启动,以确保其他所有功能都可以正常工作)。 在您的代码段中-您正在使用Flask会话身份验证(隐式)。您不会在设置SECRET_KEY的位置显示您的代码,这是Flask生成会话cookie所必需的。 我将从使用浏览器调试器开始,查看/ userLogin / log的返回值,并确保它成功并返回会话cookie。 另外-确保在您随后的AJAX调用中-确保发送了cookie。 请注意,仅仅是因为您获得了会话cookie-并不意味着您已经登录-以便帮助检查-在引用current_user的端点上添加@login_required。