Python Flask学习_用户角色和用户权限

Flask(七)用户认证与权限管理 在 Web 应用中,用户认证(Authentication)和权限管理(Authorization)是至关重要的功能。Flask 提供了多种方式来实现用户身份验证,包括。Flask-Login 提供 @login_required 装饰器,限制未登录用户访问特定页面。下一章将介绍 Flask 的异步任务与后台处理。进行 API 认证。 阅读详情

在Web App中 ,存在和游客(匿名用户),普通用户,协管员,管理员等不同的角色,应当为不同的角色赋予不同的权限。各个用户只能在权限范围内访问页面、进行操作等。

通过一个例子来说明。本例中的用户分为4中:游客、普通用户、协管员、管理员。不同的用户有着不同的权限。

一、在数据库中表示不同的角色

权限有这么几种:


操作的权限使用8位二进制数表示,现在只用了5位,剩余的可以以后用来扩展。

权限的叠加是按位与运算,列如:拥有关注用户和写文章的权限应当是0b00000001&0b00000100,结果是0b00000101。

也容易反推出,0b00000011是0b00000001&0b00000010,因此权限是:关注用户和在他人文章中写评论。

用户的不同角色在数据库SQLite中存储,权限的位值(permission)作为角色的一个字段。

roles表的字段:


使用python代码实现:

# app/models.py

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    default = db.Column(db.Boolean,default=False,index=True)
    permissions = db.Column(db.Integer)                                      #值是整数,表示位标志。
    users = db.relationship('User', backref='role', lazy='dynamic')

在Role类中定义一个静态方法,提供将记录写入数据库的方法

# app/models.py

class Role(db.model):
    @staticmethod
    def insert_roles():
        '''并不直接创建角色,而是根据数据库现有角色,然后进行更新。以后角色有更改也可执行同样操作。'''
        roles = {
            'User':(Permission.FOLLOW |Permission.COMMENT |Permission.WRITE_ARTICLES ,True),
            'Moderator':(Permission.FOLLOW |Permission.COMMENT |Permission.WRITE_ARTICLES |Permission.MODERATE_COMMENTS,False),
            'Administrator':(0xff,False)
        }
        for r in roles:
            role = Role.query.filter_by(name=r).first()
            if role is None:
                role = Role(name=r)
            role.permissions = roles[r][0]
            role.default = roles[r][1]
            db.session.add(role)
        db.session.commit()

roles有三种:

'User':表示普通用户,权限值(permission)是(Permission.FOLLOW |Permission.COMMENT |Permission.WRITE_ARTICLES ,True),其中Permission是定义了各种权限的类(相当于C++中的枚举),default是True。

'Modetator':表示协管员,权限值也列出来了,default是False。

'Administrator':表示管理员,权限值是oxff,转化为二进制是0b11111111,表示拥有所有权限。default是False。

调用这个静态方法,会把三种角色和各自的权限值写入数据库中。

最后还有一个:游客,游客不需要登录,不需要在数据库中有表示。

以上完成后,可以使用shell对话,去写入数据库。


二、赋予角色

一个新用户注册以后,要给他赋予一个角色。看他是普通用户,还是协管员,还是管理员。、

新用户注册时,会实例化一个User类 ,然后调用db.session.add(u)和db.session.commit()直至提交到数据库。

在实例化User类时,根据邮箱判断角色。

# app/models

class User(UserMixin,db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)                        #id列
    username = db.Column(db.String(64), unique=True, index=True)        #username列
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))          #role_id列
    password_hash = db.Column(db.String(128))                            #密码hash列
    email = db.Column(db.String(64),unique=True,index=True)             #email列
    confirmed = db.Column(db.Boolean,default=False)

    def __init__(self,**kwargs):
        '''构造函数:首先调用基类构造函数,如果创建基类对象后没定义角色,则根据email地址决定其角色'''
        super(User,self).__init__(**kwargs)
        if self.role is None:
            if self.email == current_app.config['FLASKY_ADMIN']:
                self.role = Role.query.filter_by(permissions=0xff).first()
            if self.role is None:
                self.role = Role.query.filter_by(default=True).first()

role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))          #users表

users = db.relationship('User', backref='role', lazy='dynamic')      #roles表
   role_id是外键,和roles.id联结。可以通过u.role访问到联结的role对象。

self.email == current_app.config['FLASKY_ADMIN']  :   判断email为特定地址的话,就设定 self.role = Role.query.filter_by(permissions=0xff).first()。

三、验证角色

为了更好更快的验证当前角色有没有某些权限,就为User定义了一些方法。

# app/models.py

class User(UserMixin,db.models):
    def can(self,permissions):
        '''检查permissions要求的权限角色是否允许'''
        return self.role is not None and (self.role.permissions & permissions)==permissions

    def is_administrator(self):
        '''检查是否管理员'''
        return self.can(Permission.ADMINISTER)

self.role is not None and (self.role.permissions & permissions)==permissions: 

要为True,需要满足两个条件:

1、role不为空,

2、role的权限值(self.role.permission)和要验证的权限(permission)的按位与操作值要和permission相等。

处于一致性考虑,还定义了AnonymousUserMixin类,并实现了can()方法和is_administrator()方法。再把它设为用户未登录时的current_user值。

# app/models.py

class AnonymousUser(AnonymousUserMixin):
    '''为了和User类保持一致,
    匿名登录时,使用current_user对象的类'''
    def can(self,permissions):
        return False

    def is_administrator(self):
        return False

login_manager.anonymous_user = AnonymousUser

用户分好了,不同用户的权限分好了,验证用户权限的方法也实现了。下面就是在视图函数中根据用户的不同 决定是否可以访问某些页面 。

首先,为了方便,定义了一些装饰器。

# app/decorators.py
'''定义装饰器'''

from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission

def permission_required(permission):
    '''定义装饰器@permission_required(permission)'''
    def decorator(f):
        @wraps(f)
        def decorated_function(*args,**kwargs):
            if not current_user.can(permission):                        #如果当前用户不具有permission则抛出403错误。
                abort(403)
            return f(*args,**kwargs)
        return decorated_function
    return decorator

def admin_required(f):
    '''定义装饰器@admin_required'''
    return permission_required(Permission.ADMINISTER)(f)

注意:403.html也要实现一下。

然后,在视图函数中使用这些装饰器 

# app/main/views.py

@main.route('/admin')
@login_required
@admin_required
def for_admin_only():
    '''测试:管理员权限'''
    role = 'admin'
    return render_template('for_permission_test.html',role=role)

@main.route('/moderator')
@login_required
@permission_required(Permission.MODERATE_COMMENTS)
def for_moderator_only():
    '''测试:协管员权限'''
    role = 'moderator'
    return render_template('for_permission_test.html',role=role)

/admin的URL只有拥有管理员权限的用户才能访问。

/moderator的URL也只有拥有协管(以上)权限的用户才能访问。


在模板中使用Permission类的方法。

还记得Permission类是定义了各种权限的值的吗?为了在模板中也能使用Permission类,可以使用上下文管理器。

# app/main/__init__.py

@main.app_context_processor
def inject_permissions():
    '''使用上下文处理器,是变量在模板全局中可访问'''
    return dict(Permission=Permission)










学习随笔 Flask用户角色与权限 角色在数据库中的表示class Permission: # 权限常量 FOLLOW = 0x01 # 关注用户 COMMENT = 0x02 # 发表评论 WRITE_ARTICLES = 0x04 # 写文章 MODERATE_COMMENTS =0x08 # 管理他们发表的评价 ADM... 阅读详情

相关推荐

基于Python-Flask的权限管理:角色管理

一、前言 角色管理主要管理角色信息,不同的角色可以访问不同的菜单和数据。 image 二、后端实现 1.ORM类 from db import db from models.BaseModel import BaseModel class Role(BaseModel): """ 角色信息表 """ __tablename__ = "t_role" id = db.Colu...

程序员八阿哥 3067

Flask权限系统设计

Flask 是一个使用 Python 编写的 Web 应用程序框架,它可以轻松地实现各种功能,包括 RBAC(基于角色的访问控制)权限系统。RBAC 是一种常见的权限管理模型,它通过定义角色和分配权限来管理用户对系统资源的访问。

bill的博客 1126

Python Flask的用户权限管理

在现代Web应用中,用户权限管理是确保系统安全性和数据完整性的重要组成部分。不同的用户在系统中拥有不同的操作权限,例如普通用户只能查看和编辑自己的信息,而管理员用户则可以管理所有用户的信息。本文的目的是详细介绍如何在Python Flask框架中实现用户权限管理,涵盖了从基本概念到实际项目应用的各个方面。范围包括基于角色的访问控制(RBAC)、权限验证、用户角色管理等核心内容。本文将按照以下结构进行组织:首先介绍核心概念与联系,包括用户、角色、权限的定义和它们之间的关系;

AI Python 编程之道的博客 718

Flask 用户权限控制问题

Flask 用户权限控制

NXNSSSSS的博客 2308

Flask-User:可自定义的用户授权和用户管理

Flask-User v1.0 注意力: Flask-User v1.0是生产/稳定版。 以前的版本是 。 用户认证和管理 因此,您正在编写Flask Web应用程序,并希望对您的用户进行身份验证。 您从一个简单的“登录”页面开始,但是很快您将需要处理: 注册和电子邮件确认 更改用户名,更改密码和忘记密码 而且还提供以下内容不是很好: 增强安全性 可靠性更高 基于角色的授权 国际化(中文,荷兰语,英语,波斯语,芬兰语,法语,德语,意大利语,波兰语,俄语,斯洛伐克语,西班牙语,瑞典语,土耳其语和乌克兰语) 可自定义,但随时可用 高度可配置-通过覆盖配置设置。 完全可定制-通过覆盖方法和属性。 随时可用-通过合理的默认设置。 支持SQL和MongoDB数据库。 有据可查 附加的功能 麻省理工学院执照 测试在Python的2.7,3.4,3.5,3.6,3.7和3.8。 覆盖

DEA各种模型原理及stata代码实现

DEA各种模型原理及stata代码实现DEA各种模型原理及stata代码实现一、CCR和BCC1.原理2.效率测算stata代码3.Malmquist指数3.1M指数3.2Global-Malmquist指数4.指数计算代码与案例二、SBM模型1.原理2.stata代码实现三、方向性距离函数(DDF)1.原理2.stata代码实现3.非径向DDF模型(NDDF)3.GML指数4.指数测算四、总结 DEA各种模型原理及stata代码实现 一、CCR和BCC 1.原理 CCR模型产出导向下的效率通过求解以下规划

wonder1322的博客 4万+

10分钟搭建权限管理系统原型:从原理到实现

点击'项目生成'按钮,等待项目生成完整后预览效果 今天想和大家分享一个快速搭建权限管理系统原型的实践过程。这个项目特别适合想了解权限控制原理但又不想陷入复杂框架的朋友,我们用Python Flask框架在200行代码内实现了一个可运行的演示系统。首先明确需求,我们需要模拟一个常见的权限场景:当普通用户尝试删除文件时,系统会提示"你需要来自ADMINISTRATORS的权限才能删除"。这个功能看似简单,但包含了权限系统的几个核心要素。系统设计分为三个主要部分:操作模拟:重点模拟删除操作时的权限验证流程实现过

GoldenleafRaven13的博客 881

内存|内存的概念、内存的作用、内存的物理结构及内存使用

内存是硬件,是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。内存是与CPU沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大。本文简单介绍了内存的概念、作用、物理结构以及使用,内存远不止如此,后续文章会逐步深入讲解。

qq_59938293的博客 2万+

python flask健身房管理系统w31m7

使用健身房管理系统的用户分管理员、用户和教练三个角色的权限子模块。管理员所能使用的功能主要有:首页、个人中心、用户管理、教练管理、健身课程管理、团课预约管理、私教预约管理、教练评价管理、健身器材管理、场地信息管理、留言板管理、管理员管理、系统管理等。用户可以实现首页、个人中心、团课预约管理、私教预约管理、教练评价管理、留言板管理等功能。教练可以实现首页、个人中心、团课预约管理、私教预约管理、教练评价管理等功能。随着数据科学的迅速发展,诸如机器学习,人工智能等新兴技术极大地方便了人们的生活。

豆包程序员 1570

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 260

Ubuntu下安装Hive3.1.2教程(附MySQL安装方法及安装包)

文章目录前言一、安装Hive1. 下载压缩包并解压2. 安装Hive3. 配置环境变量4. 修改配置文件二、MySQL安装与配置1. 安装MySQL2. 安装MySQL jdbc包3. 为Hive创建MySQL账号三、验证Hive安装及错误处理1. 启动Hadoop2. 启动hive3. 运行Hive实例总结 前言 Hive 的安装需要建立在 Hadoop 的之上(类似于Hbase),关于 Hadoop 的单机安装以及伪分布式安装可以参考作者的另两篇博客: Ubuntu下单机安装Hadoop详细教程(附

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 1万+

宠物服务系统-Python Flask MySQL

本项目是一个基于Flask框架开发的宠物服务管理平台,包含用户和管理员两大功能模块。用户端提供注册登录、服务预约、订单管理、模拟支付及评价功能;管理员端具备数据统计、订单管理、服务CRUD等后台管理功能。系统采用JWT认证、MySQL数据库及Python3.10环境,集成支付宝/微信模拟支付接口。该项目适合编程初学者学习,包含完整源码及项目截图,开发环境为PyCharm,主要技术栈包括Flask、PyMySQL等组件。提供测试账号供体验(用户user1/123456,管理员admin/123456)。

wjwjwjd的博客 139

树莓派作为Modbus服务器:pymodbus配置全记录

手把手教你用树莓派部署Modbus服务器,核心基于pymodbus实现数据通信与设备控制,涵盖配置步骤与常见问题,适合工业自动化场景应用。

weixin_42510201的博客 756

python flask课程学习网站

简单说,一个管安全规则,一个管身份凭证,组合起来为Web应用打造可靠防护。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。

qq_840612233的博客 163

基于STM32、HAL库的W25Q01JVZEIQ TR FLASH存储器驱动应用程序设计

1Gb (128MB),分为512个可擦除块(block),每个块256KB。:块擦除约30-50ms,芯片擦除约30s。:标准SPI (支持1/2/4线模式)// 初始化CS引脚为高电平。// 擦除扇区(4KB)// 初始化Flash。/* 状态寄存器位 *//* 指令定义 *//* 超时定义 *//* 函数声明 */

corlin6688的博客 268

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 918

餐厅管理系统-flask html

本项目是基于Flask框架开发的餐饮信息管理系统,包含用户、商家和管理员三种角色。系统功能包括:用户可浏览餐厅、收藏及评论;商家可管理餐厅和菜品;管理员负责审核及用户管理。采用Python3.8+MySQL5技术栈,前端使用Bootstrap5+原生JS。提供完整源码及测试账号(管理员/用户/商家),适合编程初学者学习Flask开发实战。项目已调试确保正常运行,可作为入门级Web开发参考案例。

wanglindda的博客 174

Serial RapidIO Gen2 IP 说明(三)

前言 继续接着上篇文章,介绍Serial RapidIO Gen2 IP 的具体端口信息。 一、端口描述 1、缓冲设计接口 2、物理层接口 参考说明 【1】Serial RapidIO Gen2 v4.1https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/srio_gen2/v4_1/pg007_srio_gen2.pdf ...

记录所学,分享知识,结识挚友 1321

python+django/flask基于云的学习笔记系统

随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。 系统实现登录、个人信息修改,还可以对个人中心,用户管理,笔记本管理,笔记分享管理,分享类型管理,学习资料管理,购买资料管理,完整资料管理,系统管理等功能进行操作,增强了使用者的操作体验。

2501_91488339的博客 201

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

机器学习毕业设计:Python+Flask+Stacking集成学习 电影推荐与票房预测系统(KNN算法+Echarts 源码+文档)✅

本文介绍了一个基于Python技术的电影推荐与票房预测系统。项目整合了Flask框架、MySQL数据库、requests爬虫、Echarts可视化等技术,并采用机器学习算法实现核心功能。系统主要包含两个关键模块:一是基于Stacking集成学习(融合决策树、Lasso、随机森林和GDBT算法)的票房预测模块,提升预测精度;二是基于KNNWithZScore算法的个性化推荐模块。此外,系统还实现了电影数据采集与存储、多维度数据可视化展示等功能,支持普通用户、管理员和后台管理员三级角色,分别提供个性化推荐、信息

vx_biyesheji0001的博客 1466

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大数据项目:Python+Flask+Stacking集成学习 电影推荐与票房预测系统(KNN算法+Echarts 源码+文档)✅

大数据项目:Python+Flask+Stacking集成学习 电影推荐与票房预测系统(KNN算法+Echarts 源码+文档)✅

B站计算机毕业设计之家的博客 1142

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python基于flask的在线教学课程网站小儿培训系统 作业考试学习记录s6462ul6

后端采用Flask框架搭配SQLAlchemy ORM,数据库使用MySQL或SQLite。在线教学课程网站需要实现用户管理、课程管理、作业考试、学习记录跟踪等功能。核心模块包括学员端、教师端和管理员端,支持视频学习、在线测试、成绩统计等教学场景。系统开发应采用敏捷迭代方式,优先实现核心教学功能,后续逐步完善讨论区、直播课等扩展功能。需要成品或者定制,文章最下方名片联系我即可~ 所有项目都经过测试完善,本系统包修改时间和标题,包安装部署运行调试,不满意的可以定制。框架:flask/django。

QQ_188083800的博客 47

论坛网站全栈项目Vue3+Python+Flask+MySQL+Redis

校园论坛网站系统。使用技术:python+Flask+Vue3+MySQL+Redis 主要功能: ● 用户登录、注册 ● 首页(轮播图显示、文章显示、分页、文章分类) ● 发表文章,轮播图,对文章的评论 ● 查询(基于文章时间、评论个数、所属分类) ● 个人中心(编辑个人头像、个性签名) 后台管理,权限管理

子午的博客 1528

python+Hadoop+Spark+Hive农作物产量预测分析 农产品可视化 农业数据分析可视化系统 农作物产量数据分析 机器学习预测算法

摘要: 本文设计并实现了一个基于Flask框架的农业产量预测与可视化系统。系统采用Python+Flask+MySQL技术栈,前端使用HTML/CSS/JavaScript结合ECharts实现数据可视化,后端采用XGBoost机器学习模型进行产量预测。主要功能包括数据可视化大屏、产量预测分析、气象/产量数据管理以及用户登录注册模块。系统实现了农业生产数据的集中管理、可视化展示和智能预测,为农业决策提供支持。尽管在用户调研和移动端适配方面存在改进空间,但实验结果表明系统具有良好的性能和实用价值,有助于提高农

qq_79120063的代码博客 49

毕业设计--基于大数据的电信诈骗案件分析系统

本项目是一个基于 Python 和 Flask 框架开发的电信诈骗案件分析系统。该系统主要用于管理电信诈骗案件数据,提供后台管理功能,支持用户登录、注册、角色管理及案件数据管理。管理员可以通过后台查看、添加和修改案件信息,进行相关数据分析。本系统为电信诈骗案件分析提供了一个基于 Flask 的后台管理平台,具备用户管理、案件数据管理等基本功能。系统采用 Flask-Security 进行身份验证与角色管理,通过 Flask-Admin 实现后台管理界面的快速搭建。

laoman456的博客 1714

【关注可白嫖源码】--课程设计--毕业设计--基于Python+Flask的青岛工学院学生课程笔记共享系统[编号:project29026](案件分析)

系统设计与实现有诸多价值。将学生课程笔记纳入到系统的管理之中,把零散的个人学习成果转变为可以检索、浏览、评价的集体知识资产,师生都能从其中获得课程学习多方面的角度。教师通过查看学生的笔记可以了解学生对教学内容的接受程度,学生通过笔记评价功能可以得到学习反馈,论坛帖子功能扩大了课程讨论的时空范围。排课信息和课程资料的整合呈现,可以减少学生在多个平台之间切换查询的时间成本。操作流程规范性降低了人工干预的必要性,资源审核保证了内容质量,收藏、点赞、评论等功能提升了学习社群活跃度。系统建立起来的资源共享模式可以给其

Biye_Design的博客 395
上一篇: Python Flask学习_确认账户(使用电子邮件)
下一篇: Python Flask学习_用户资料系统总结
bird333
博客等级 码龄9年 19粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值