实战篇:权限控制模块开发
权限控制模块简介
权限控制模块用于管理用户对应用中不同功能的访问权限。通过为用户分配角色和权限,可以控制他们可以执行的操作。
项目结构
继续使用之前讨论的Flask项目结构。
第1步:定义角色和权限
在app/models/models.py
中定义角色和权限模型。
from app import db
from flask_security import UserMixin, RoleMixin
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128))
roles = db.relationship('Role', secondary='user_roles',
backref=db.backref('users', lazy='dynamic'))
第2步:创建数据库迁移
使用Flask-Migrate来创建新的数据库迁移。
flask db migrate -m "Add roles and user_roles tables"
flask db upgrade
第3步:初始化Flask-Security
在run.py
或其他初始化脚本中初始化Flask-Security。
from flask_security import Security, SQLAlchemyUserDatastore
# 创建用户和角色数据存储
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
第4步:创建角色和初始用户
创建一些初始角色和用户,通常在应用首次运行时执行。
@app.before_first_request
def create_user():
if not User.query.first():
# 创建角色
admin_role = user_datastore.create_role(name='admin')
user_datastore.commit()
# 创建管理员用户
admin_user = user_datastore.create_user(email='admin@example.com',
password='password')
user_datastore.add_role(admin_user, admin_role)
user_datastore.commit()
第5步:保护路由
使用Flask-Security提供的装饰器来保护需要认证或特定角色的路由。
from flask_security import login_required, roles_required
@app.route('/admin')
@login_required
@roles_required('admin') # 只有角色为admin的用户可以访问
def admin_dashboard():
return 'Admin Dashboard'
第6步:注册和登录视图
Flask-Security提供了一套默认的认证视图,你可以直接使用或覆盖它们。
# 使用Flask-Security的默认认证视图
# 在run.py或app/__init__.py中注册蓝图
from flask_security.core import Security
from flask_security.views import auth
security = Security(app, user_datastore)
app.register_blueprint(auth)
第7步:测试权限控制
在tests/test_routes.py
中编写测试用例来验证权限控制。
def test_admin_access(client):
response = client.get('/admin')
assert response.status_code == 302 # 未登录重定向到登录页面
# 登录测试用户并尝试访问
# ...
结语
在本实战篇中,我们开发了一个基本的权限控制模块,包括角色定义、用户角色分配、路由保护和测试。
记得在开发过程中编写测试用例,并确保它们通过。这将帮助你确保代码的质量,并在将来重构或添加新功能时提供安全网。此外,Flask-Security提供了许多高级功能,如一次性密码、邮箱确认等,可以根据需要集成这些功能。