使用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判断当前用户是否拥有某种角色权限的例子。你可以根据自己的需求修改和扩展这个例子。
