1

我正在使用烧瓶安全来处理用户注册、登录等。在使用默认烧瓶安全视图注册新用户时遇到问题。

编辑

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

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

问题是确认 url/view 似乎使用了 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=[])

有没有人知道问题可能是什么?提前致谢!

4

2 回答 2

2

感谢 deadbeef404,几乎搞定了。我会评论你的答案,但我没有任何代表。

实际上烧瓶登录使用它自己的 AnonymousUserMixin 类。以下代码段显示了如何使用烧瓶安全的 AnonymousUser 类覆盖它。

login_manager = LoginManager()
from flask.ext.security import AnonymousUser
login_manager.anonymous_user = AnonymousUser
于 2015-08-30T09:42:31.720 回答
0

我不确定您的确切问题是什么,但似乎烧瓶主体正试图AnonymousUser像经过身份验证的用户一样使用(没有人登录时内存中的身份)。AnAnonymousUser没有roles属性,因此当它尝试访问它时,它会引发异常。

于 2015-02-26T01:43:26.520 回答