基于Flask-Login简单登录和权限控制实践

[复制链接]
发表于 昨天 20:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 关于Flask-Login

Flask-Login 是一个为python Flask Web框架计划的扩展,用于管理用户会话(用户登录状态)。它提供了简单的接口来处置惩罚用户登录、注销、记着用户等功能,同时确保用户会话的安全性。以下是 Flask-Login 的一些关键特性和功能
1.1. 紧张功能

      
  • 用户会话管理:

      
  • 管理用户登录和注销状态。  
  • 自动处置惩罚未登任命户访问受掩护资源时的重定向。
      
  • 记着我功能:

      
  • 提供“记着我”功能,允许用户在关闭欣赏器后仍旧保持登录状态。  
  • 通过安全的恒久化会话(如 cookie)实现。
      
  • 用户加载回调:

      
  • 允许开发者界说一个回调函数,用于从用户 ID 加载用户对象。  
  • 支持从数据库或其他存储中动态加载用户。
      
  • 登录掩护:

      
  • 提供装饰器 @login_required,用于掩护须要用户登录的视图。

      
  • 提供防止会话固定攻击(session fixation)的功能。  
  • 支持用户登录后革新会话 ID。
1.2. 核心组件

      
  • LoginManager:

      
  • 核心管理器,用于设置和管理用户会话。  
  • 通常在应用初始化时创建。
      
  • User 模子:
    开发者须要界说一个用户模子,该模子必须实现 Flask-Login 所需的接口方法:

      
  • is_authenticated:是否已认证。  
  • is_active:用户是否激活。  
  • is_anonymous:是否是匿名用户。  
  • get_id():返回用户的唯一标识符(通常是用户 ID)。
      
  • 用户加载回调:

      
  • 通过 LoginManager.user_loader 装饰器界说,用于从用户 ID 加载用户对象。  
  • 示例:
  1. from flask_login import UserMixin
  2. class User(UserMixin):
  3.     def __init__(self, id):
  4.         self.id = id
  5. @login_manager.user_loader
  6. def load_user(user_id):
  7.     # 假设从数据库加载用户
  8.     return User(user_id)
复制代码
      
  • 装饰器:

      
  • @login_required:掩护视图,确保用户已登录。  
  • 示例:
  1. from flask import Flask, redirect, url_for
  2. from flask_login import login_required, current_user
  3. @app.route('/dashboard')
  4. @login_required
  5. def dashboard():
  6.     return f'Welcome, {
  7.      
  8.      current_user.id}!'
复制代码
1.3. 注意事项

      
  • 安全性:

      
  • 确保使用安全的 secret_key。  
  • 如果使用“记着我”功能,确保启用安全的 cookie 设置(如 HttpOnly 和 Secure 标志)。
      
  • 用户模子:

      
  • 用户模子必须实现 Flask-Login 所需的接口方法。  
  • 保举使用 UserMixin 提供默认实现。
      
  • 错误处置惩罚:
    确保处置惩罚用户加载失败的情况,比方用户不存在时返回得当的相应。
2. 我的简单登录和权限控制实践

下面是一个简便的 Flask 登录和权限控制方案,使用 Flask-Login 扩展实现根本功能。
2.1. 安装须要扩展

  1. pip install flask-login
复制代码
2.2. Flask应用工程目次布局

  1. flask_auth_example/
  2. ├── app.py                # 主应用文件
  3. ├── templates/
  4. │   ├── base.html         # 基础模板
  5. │   ├── index.html        # 首页
  6. │   ├── login.html        # 登录页面
  7. │   ├── register.html     # 注册页面
  8. │   └── admin.html        # 管理员页面
  9. ├── requirements.txt      # 依赖文件
  10. └── instance/
  11.     └── database.db       # SQLite数据库
复制代码

      
  • 数据库为sqlite3,python以及集成。
2.3. 底子实今世码

下面是一个使用 Flask-Login 实现用户登录和根本权限管理的完备样例。这个示例包罗用户登录、登出、注册功能,以及基于脚色的权限控制。
2.3.1. 应用代码 (app.py)

  1. from flask import Flask, render_template, redirect, url_for, flash, request
  2. from flask_sqlalchemy import SQLAlchemy
  3. from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
  4. from werkzeug.security import generate_password_hash, check_password_hash
  5. app = Flask(__name__)
  6. app.config['SECRET_KEY'] = 'your-secret-key-here'
  7. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instance/database.db'
  8. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
  9. db = SQLAlchemy(app)
  10. login_manager = LoginManager(app)
  11. login_manager.login_view = 'login'
  12. # 用户角色
  13. class Role:
  14.     USER = 'user'
  15.     ADMIN = 'admin'
  16. # 用户模型
  17. class User(UserMixin, db.Model):
  18.     id = db.Column(db.Integer, primary_key=True)
  19.     username = db.Column(db.String(100), unique=True, nullable=False)
  20.     password_hash = db.Column(db.String(200), nullable=False)
  21.     role = db.Column(db.String(20), default=Role.USER)
  22.    
  23.     def set_password(self, password):
  24.         self.password_hash = generate_password_hash(password)
  25.    
  26.     def check_password(self, password):
  27.         return check_password_hash(self.password_hash, password)
  28. # 创建数据库表
  29. with app.app_context():
  30.     db.create_all()
  31. @login_manager.user_loader
  32. def load_user(user_id):
  33.     return User.query.get(int(user_id))
  34. # 自定义装饰器检查权限
  35. def admin_required(func):
  36.     @login_required
  37.     def decorated_view(*args, **kwargs):
  38.         if current_user.role != Role.ADMIN:
  39.             flash('您没有访问此页面的权限', 'danger')
  40.             return redirect(url_for('index'))
  41.         return func(*args, **kwargs)
  42.     return decorated_view
  43. @app.route('/')
  44. def index():
  45.     return render_template('index.html')
  46. @app.route('/login', methods=['GET', 'POST'])
  47. def login():
  48.     if current_user.is_authenticated:
  49.         return redirect(url_for('index'))
  50.    
  51.     if request.method == 'POST':
  52.         username = request.form.get('username')
  53.         password = request.form.get('password')
  54.         remember = request.form.get('remember') == 'on'
  55.         
  56.         user = User.query.filter_by(username=username).first()
  57.         
  58.         if user and user.check_password(password):
  59.             login_user(user, remember=remember)
  60.             flash('登录成功!', 'success')
  61.             next_page = request.<
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表