使用烧瓶安全性确认注册时出错



我使用flask安全性来处理用户注册、登录等。在使用默认的flask安全视图注册新用户时,我遇到了一个问题。

编辑

我设法在解决这个问题上取得了一些进展。最初的问题是我没有提供load_user回调。现在我在做:

@login_manager.user_loader
def load_user(user_id):
    return User.objects.get(id=user_id)

问题是确认url/视图似乎使用了AnonymousUser,因此查询过滤器与正确的用户不匹配。有线索吗?

原件

我可以在注册视图中提供用户邮件和密码,我成功地收到了一封确认电子邮件(flask security提供的默认模板),但当我试图确认帐户时,点击邮件确认链接,我会得到以下属性错误:

AttributeError: 'AnonymousUserMixin' object has no attribute 'roles'

以下是完整的回溯:

Traceback (most recent call last):
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-  packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
     rv = self.handle_user_exception(e)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask_security/views.py", line 226, in confirm_email
    logout_user()
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask_security/utils.py", line 92, in logout_user
    identity=AnonymousIdentity())
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/blinker/base.py", line 267, in send
    for receiver in self.receivers_for(sender)]
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask_principal.py", line 469, in _on_identity_changed
    self.set_identity(identity)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask_principal.py", line 418, in set_identity
    self._set_thread_identity(identity)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask_principal.py", line 463, in _set_thread_identity
    identity=identity)
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/blinker/base.py", line 267, in send
    for receiver in self.receivers_for(sender)]
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/flask_security/core.py", line 217, in _on_identity_loaded
    for role in current_user.roles:
  File "/home/infante/PycharmProjects/venvs/wp/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
AttributeError: 'AnonymousUserMixin' object has no attribute 'roles'

这是我的应用程序配置:

from flask import Flask
from flask.ext.security import MongoEngineUserDatastore, Security
from flask_login import LoginManager
from flask_mail import Mail
from wpapp.models import db, User, Role
from wpapp.views import frontend
from wpapp.configs import CONFS

login_manager = LoginManager()
app = Flask(__name__)
app.config["MONGODB_SETTINGS"] = CONFS['MONGODB_SETTINGS']
app.config["SECRET_KEY"] = CONFS['SECRET_KEY']
app.config['SECURITY_PASSWORD_HASH'] = CONFS['SECURITY_PASSWORD_HASH']
app.config['SECURITY_PASSWORD_SALT'] = CONFS['SECURITY_PASSWORD_SALT']
app.config['SECURITY_REGISTERABLE'] = CONFS['SECURITY_REGISTERABLE']
app.config['SECURITY_CONFIRMABLE'] = CONFS['SECURITY_CONFIRMABLE']
app.config['SECURITY_RECOVERABLE'] = CONFS['SECURITY_RECOVERABLE']
app.config['SECURITY_REGISTER_URL'] = CONFS['SECURITY_REGISTER_URL']
app.config['MAIL_SERVER'] = CONFS['MAIL_SERVER']
app.config['MAIL_PORT'] = CONFS['MAIL_PORT']
app.config['MAIL_USE_SSL'] = CONFS['MAIL_USE_SSL']
app.config['MAIL_USERNAME'] = CONFS['MAIL_USERNAME']
app.config['MAIL_PASSWORD'] = CONFS['MAIL_PASSWORD']
mail = Mail(app)
app.register_blueprint(frontend)
db.init_app(app)
user_datastore = MongoEngineUserDatastore(db, User, Role)
security = Security(app, user_datastore)
login_manager.init_app(app)
if __name__ == '__main__':
    app.run()

以下是我的模型定义(我使用的是mongodb):

from flask.ext.mongoengine import MongoEngine
from flask.ext.security import UserMixin, RoleMixin
db = MongoEngine()
class Role(db.Document, RoleMixin):
    name = db.StringField(verbose_name=u"Nome",
                          help_text=u"Inserir um nome para identificação do Papel.",
                          max_length=50,
                          required=True,
                          unique=True)
    description = db.StringField(verbose_name=u"Descrição",
                                 help_text=u"Inserir descrição sucinta sobre o Papel.",
                                 max_length=255)

class User(db.Document, UserMixin):
    email = db.StringField(verbose_name=u"E-mail",
                           help_text=u"Cadastrar um e-mail válido.",
                           max_length=255,
                           required=True,
                           unique=True)
    password = db.StringField(verbose_name=u"Senha",
                              help_text=u"Cadastrar sua senha para acesso.",
                              required=True,
                              max_length=255)
    active = db.BooleanField(verbose_name=u"Ativo",
                             help_text=u"Indica se o usuário está ativo no sistema.",
                             default=True)
    confirmed_at = db.DateTimeField(verbose_name=u"Confirmação",
                                    help_text=u"Horário de confirmação do usuário")
    roles = db.ListField(db.ReferenceField(Role),
                         verbose_name=u"Papéis",
                         help_text=u"Atribuir papéis ao usuário.",
                         default=[])

有人知道问题出在哪里吗?提前感谢!

谢谢deadbeef404,非常成功。我本想对你的答案发表评论,但我没有任何代表。

实际上flask登录使用它自己的AnonymousUserMixin类。以下片段显示了如何使用flask安全性的AnonymousUser类覆盖它。

login_manager = LoginManager()
from flask.ext.security import AnonymousUser
login_manager.anonymous_user = AnonymousUser

我不确定你的确切问题是什么,但flask主体似乎试图像经过身份验证的用户一样使用AnonymousUser(当没有人登录时,内存中的标识)。AnonymousUser没有roles属性,因此当它尝试访问它时,会抛出一个Exception。

最新更新