欢迎访问宙启技术站
智能推送

使用flask_login.current_user判断当前用户是否拥有某种角色权限

发布时间:2023-12-24 23:23:23

Flask-Login是一个Flask扩展,用于管理用户登录、认证和会话。它提供了一个名为current_user的全局变量,用于获取当前登录的用户对象。

首先,安装Flask-Login:

pip install flask-login

然后,在Flask应用程序中初始化Flask-Login:

from flask import Flask
from flask_login import LoginManager

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

login_manager = LoginManager()
login_manager.init_app(app)

接下来,你需要为你的用户模型添加一个is_authenticated和is_active的方法,并创建一个用于加载用户的函数。

下面是一个示例的用户模型和加载用户的函数:

from flask_login import UserMixin

class User(UserMixin):
    def __init__(self, id, name, email, password):
        self.id = id
        self.name = name
        self.email = email
        self.password = password

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def get_id(self):
        return self.id

# 用户列表
users = [
    User('1', 'John Doe', 'john@example.com', 'password1'),
    User('2', 'Jane Smith', 'jane@example.com', 'password2')
]

# 加载用户的函数
def load_user(user_id):
    for user in users:
        if user.id == user_id:
            return user
    return None

接下来,你需要创建一个登录视图,并使用login_required装饰器来保护只有登录用户才能访问的页面。

from flask_login import login_required, current_user

@app.route('/dashboard')
@login_required
def dashboard():
    if current_user.has_role('admin'):
        return 'Hello admin!'
    else:
        return 'Hello user!'

你可以在上面的视图函数中使用current_user.has_role()方法来判断当前用户是否具有某种角色权限。

下面是一个current_user.has_role()方法的示例实现:

from flask_login import current_user

def has_role(self, role_name):
    # 获取用户的角色列表(假设角色存储在user.roles属性中)
    roles = getattr(self, 'roles', [])
    return role_name in roles

在上面的示例中,我们假设用户的角色存储在user.roles属性中。你可以根据实际情况自己定义角色的存储方式和判断逻辑。

最后,你需要为Flask-Login提供一个加载用户的函数。在上面的示例中,我们已经创建了一个名为load_user()的函数来实现这个功能。

@login_manager.user_loader
def load_user(user_id):
    return load_user(user_id)

现在,你可以使用current_user.has_role()方法来判断当前用户是否具有某种角色权限了。

为了演示,下面是一个完整的示例:

from flask import Flask, render_template, redirect, url_for
from flask_login import LoginManager, login_user, logout_user, login_required, current_user

app = Flask(__name__)

app.config['SECRET_KEY'] = 'your-secret-key'

login_manager = LoginManager()
login_manager.init_app(app)

class User:
    def __init__(self, id, name, email, password, roles):
        self.id = id
        self.name = name
        self.email = email
        self.password = password
        self.roles = roles

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def get_id(self):
        return self.id

    def has_role(self, role_name):
        return role_name in self.roles

users = [
    User('1', 'John Doe', 'john@example.com', 'password1', ['user']),
    User('2', 'Jane Smith', 'jane@example.com', 'password2', ['user', 'admin'])
]

@login_manager.user_loader
def load_user(user_id):
    for user in users:
        if user.id == user_id:
            return user
    return None

@app.route('/')
def index():
    return 'Hello, world!'

@app.route('/login')
def login():
    user = users[0]
    login_user(user)
    return redirect(url_for('dashboard'))

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('index'))

@app.route('/dashboard')
@login_required
def dashboard():
    if current_user.has_role('admin'):
        return 'Hello admin!'
    else:
        return 'Hello user!'

if __name__ == '__main__':
    app.run()

以上是使用Flask-Login中的current_user判断当前用户是否拥有某种角色权限的例子。你可以根据自己的需求修改和扩展这个例子。