Flask用户-@login_required和@roles_required无法正常工作

问题描述 投票:1回答:1

我正在尝试使用Flask-User(包含Flask-Login)。我想使用@login_required@roles_required装饰器来管理对路由的访问。但是,它不起作用。

Flask-User文档显示login_required是从flask_user而不是flask_login导入的。从flask_login导入时,它可以按预期工作,但是如果我将其切换为从flask_user导入,则无法使用。相反,它表示未登录经过身份验证的用户。

为什么我不只是从flask_login导入?好吧,我可以,但是那不能解决我的另一个问题,即只能从@roles_required导入flask_user,而且也不起作用(与上述问题相同-表示未登录经过身份验证的用户)。

我的设置在下面。如果有人可以帮助我,我将不胜感激。我以前曾让Flask User在另一个应用程序上工作,但无法弄清楚这里出了什么问题。目前,用户数据库存储在SQLite数据库中。

config.py

# Flask-User settings
    USER_APP_NAME = "App name"      # Shown in and email templates and page footers
    USER_ENABLE_EMAIL = True        # Enable email authentication
    USER_ENABLE_USERNAME = False    # Disable username authentication
    USER_EMAIL_SENDER_NAME = USER_APP_NAME
    USER_EMAIL_SENDER_EMAIL = "email"
    USER_ENABLE_AUTH0 = True

    USER_UNAUTHENTICATED_ENDPOINT = "login"
    USER_UNAUTHORIZED_ENDPOINT = "login"

__ init __。py

# Initialise flask_login
login = LoginManager(app)
login.login_view = 'login'
login.refresh_view = "login"
login.needs_refresh_message = "Please sign in again to access this page"

models.py

from andon import db, app, login
from flask_user import UserMixin, UserManager
from flask_login import current_user

@login.user_loader
def load_user(id):
    return User.query.get(int(id))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)

    # User Authentication fields
    email = db.Column(db.String(255), nullable=False, unique=True)
    email_confirmed_at = db.Column(db.DateTime())
    password = db.Column(db.String(255), nullable=False)

    # User fields
    active = db.Column(db.Boolean())
    first_name = db.Column(db.String(50), nullable=False)
    last_name = db.Column(db.String(50), nullable=False)
    registered = db.Column(db.DateTime, default=datetime.utcnow)
    last_login = db.Column(db.DateTime)
    client_id = db.Column(db.Integer, db.ForeignKey('client.id', ondelete='CASCADE'))
    login_count = db.Column(db.Integer, default=0)
    invitation_token = db.Column(db.String(50))

    roles = db.relationship('Roles', secondary='user_roles')

    def check_password(self, password):
        # Check password against hash; return True or False
        return bcrypt.checkpw(password.encode('utf8'), self.password)

# Define the Role data model
class Roles(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(50), nullable=False, unique=True)  # for @roles_accepted()

    def __repr__(self):
        return self.name


# Define the UserRoles association model
class UserRole(db.Model):
    __tablename__ = 'user_roles'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('roles.id', ondelete='CASCADE'))

# Setup Flask-User
user_manager = UserManager(app, db, User)

main.py

from flask_login import current_user, login_user, logout_user
from flask_user import roles_required, login_required

@app.route('/test')
@login_required
def register_hub():

    return "Test"
python flask flask-login flask-user
1个回答
0
投票
由于我的用户帐户没有标记,表明它已通过电子邮件验证,因此被抛出为没有任何登录权限。令人烦恼的是,flask-user在这种情况下不会引发描述性错误,而只是说用户未登录。

因此,解决方法:设置USER_ENABLE_EMAIL = False,除非您要在用户访问@login_required路由之前强制进行电子邮件验证。

© www.soinside.com 2019 - 2024. All rights reserved.