Логин работает, но current_user не аутентифицирован - PullRequest
0 голосов
/ 14 февраля 2019

Мой логин работает, но текущий пользователь не создается / не аутентифицирован.

Менеджер входа:

@login_manager.user_loader
    def load_user(username):
    #users is my mongodb collection
    user = users.find_one({"_id": username})
    if not user:
       return None
    return User(user['_id'])

Маршрут входа:

@app.route("/login", methods=['GET', 'POST'])
def login():

  login = LoginForm()

  if current_user.is_authenticated:
    return redirect(url_for('feed'))

  if login.submit.data and login.validate():
      #users is my mongodb collection
      user = users.find_one({"email": login.email.data})
      if user and User.validate_login(user['password'], login.password.data):
        user_obj = User(json_util.dumps(user['_id']))
        login_user(user_obj, remember=login.remember.data)
        flash(f'Login Successful, welcome {user["name"]}.', 'success')
        return redirect(url_for('feed'))
      else:
        flash('Login Unsuccessful. Please check email and password', 'warning')

  return render_template(
    'login.html',
    login=login
  )

Класс пользователя:

class User():

def __init__(self, username):
    self.username = username

def is_authenticated(self):
    return True

def is_active(self):
    return True

def is_anonymous(self):
    return False

def get_id(self):
    return self.username

@staticmethod
def validate_login(password_hash, password):
    return bcrypt.check_password_hash(password_hash, password)

Маршрут подачи:

@app.route("/feed")
def feed():

  if not current_user.is_authenticated:
    #flash(f'{current_user.is_authenticated} {current_user._id}', 'warning')
    return redirect(url_for('welcome'))

#etc etc 

После входа в систему пользователь должен быть перенаправлен на маршрут подачи, это работает, однако вы перенаправлены обратно из-за отсутствия аутентификации.

Я видел, как сессия использовалась, чтобы обойти эту проблему, однако все еще любопытно решить эту проблему.

Источники, с которыми я консультировался:

1 Ответ

0 голосов
/ 14 февраля 2019

Решение: я искал mongoDB, используя строку вместо ObjectId в load_user.Я решил переключиться на поиск с вмененной электронной почтой пользователей, она работала, и я заметил мою проблему.

@login_manager.user_loader
def load_user(user_id):
    user = users.find_one({"_id": ObjectId(user_id)})
    if not user:
        return None
    return User(str(user['_id'])

Извлеченный урок, строки! = ObjectId.Надеюсь, это поможет любому, у кого возникла подобная проблема!

...