flask框架-认证权限(一):使用g对象存登录用户信息,认证权限一起实现

这篇具有很好参考价值的文章主要介绍了flask框架-认证权限(一):使用g对象存登录用户信息,认证权限一起实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、项目结构和基本的依赖包

apps

        -user

        __init__.py

authen

       __init__.py

        token.py

ext

        __init__.py

util.py

       public.py

        __init__.py

app.py

依赖包

alembic==1.8.1
click==7.1.2
Flask==1.1.4
Flask-Migrate==2.7.0
Flask-Script==2.0.6
Flask-SQLAlchemy==2.4.1
greenlet==2.0.1
importlib-metadata==5.0.0
importlib-resources==5.10.0
itsdangerous==1.1.0
Jinja2==2.11.3
Mako==1.2.4
MarkupSafe==2.0.1
PyMySQL==1.0.2
SQLAlchemy==1.3.0
typing_extensions==4.4.0
Werkzeug==1.0.1
zipp==3.10.0
Flask-RESTful==0.3.9
PyJWT==2.7.0
websocket-client==1.5.1
gevent==22.10.1
gevent-websocket==0.10.1
Flask-Caching==2.0.2
redis==4.5.5

二、配置token认证和解析

authen/token.py

from flask import request,g
import jwt
import time
from flask import jsonify
from functools import wraps #类装饰器
#导入用户表:这个根据用户自己来
from apps.user.models import UserModel


JWT_SECRET_KEY = '$#%^&&*(DFHJKUTYGHF112312' #加密的盐
ALGORITHM = 'HS256' #加密算法

#生成token
def jwt_encode_token(user_id:int,time_out=7*24*60*60):
    payload = {
        'user_id': user_id,
        'iat': time.time(), #产生token时的时间戳
        'exp': time.time() + time_out #token过期时间戳
    }
    token = jwt.encode(payload, JWT_SECRET_KEY, algorithm=ALGORITHM)
    return token

#解析token
def jwt_decode_token(token):
    secret = JWT_SECRET_KEY
    payload = jwt.decode(token,secret,algorithms=ALGORITHM)
    return payload


#类装饰器:需要认证
def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        token = request.cookies.get('token', "none")
        if not token:
            token = request.headers.get('token', "none")
        try:
            payload = jwt_decode_token(token)
        except Exception as e:
            return jsonify({'code': 410, 'error': 'token有问题'}),403
        user_id = payload.get('user_id')
        exp = payload.get('exp')
        now = time.time()
        obj = UserModel.query.filter_by(id=user_id).first()
        if not obj:
            return jsonify({'code': 410, 'error': 'token有问题'}),403
        if exp < now:
            return jsonify({'code': 410, 'error': 'token已经过期了'}),403
        g.user = obj
        #认证通过,执行视图函数
        return func(*args,**kwargs)
    return wrapper



def authen_admin_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not hasattr(g,'user'):
            return jsonify({'code':410,'msg':'请先登录'})
        if g.user.role != '管理员':
            return jsonify({'code': 410, 'msg': '没有管理员权限,无法操作'}), 403
        # 认证通过,执行视图函数
        return func(*args, **kwargs)

    return wrapper

if __name__ == '__main__':
    token = jwt_encode_token(78)

三、视图类使用

user/views.py

from flask.views import MethodView
from flask import jsonify
from flask import request,g
from ext import db


#模型类
from . import models
#认证相关的 
from authen.token import jwt_encode_token,login_required,admin_required,authen_admin_required


class RoleView(MethodView):
    #所有视图函数都需要登录认证
    decorators=[login_required]
    def get(self):
        objs = models.RoleModel.query.all()
        lis = []
        for obj in objs:
            lis.append({'id':obj.id,'name':obj.name})
        return jsonify({'code':200,'data':lis})
    #post请求需要有管理员权限
    @authen_admin_required
    def post(self):
        print(g.user)
        name = request.form.get('name')
        if not name:
            return jsonify({'code':400,'error':'请携带上权限名'})

        obj = models.RoleModel.query.filter_by(name=name).first()
        if obj:
            return jsonify({'code':400,'error':f'{name} 权限已经存在了'})
        else:
            obj = models.RoleModel()
            obj.name=name
            db.session.add(obj)
            db.session.commit()
            return jsonify({'code':200,'msg':f'新增角色:{name} 成功'})

认证大致的逻辑:

1、用户登录时,生成token,前端保存token信息

2、前端发起请求时,将token携带在cookies或请求头中

3、后端拿到token,先解析出token的用户信息,将用户信息存到g对象中

4、认证通过后,就可以在请求函数中通过g获取到当前登录的用户。

管理员权限认证的逻辑:

1、依赖于登录认证的流程,

2、在进入视图函数前,先检验是否通过登录认证了

3、登录认证通过了,就可以通过g获取当前登录的用户信息

4、再对登录的用户的信息进行权限的判断文章来源地址https://www.toymoban.com/news/detail-487572.html

到了这里,关于flask框架-认证权限(一):使用g对象存登录用户信息,认证权限一起实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决:Python-Flask框架—通过flask_login模块及Session模块检测是否有用户登录

    目录 一、简单示例 二、查看session信息 三、设置session过期时间   要在Flask中检测用户是否登录,可以使用以下方法: 在用户登录时,将用户的登录状态存储在会话中。例如,使用 flask_login 库进行用户认证和登录。 在需要检查用户是否登录的视图函数中,从会话中获取用户

    2024年02月22日
    浏览(30)
  • spring boot中常用的安全框架 Security框架 利用Security框架实现用户登录验证token和用户授权(接口权限控制)

    spring boot中常用的安全框架 Security 和 Shiro 框架 Security 两大核心功能 认证 和 授权 重量级 Shiro 轻量级框架 不限于web 开发 在不使用安全框架的时候 一般我们利用过滤器和 aop自己实现 权限验证 用户登录 Security 实现逻辑 输入用户名和密码 提交 把提交用户名和密码封装对象

    2024年02月06日
    浏览(39)
  • SSM+Shiro安全框架整合(完成安全认证--登录+权限授权)+ssm整合shiro前后端分离

    目录 1.搭建SSM框架  1.1.引入相关的依赖 1.2. spring配置文件 1.3. web.xml配置文件 1.4.配置Tomcat并启动 2.ssm整合shiro---认证功能  (1).引入依赖 (2).修改spring配置文件 (3).修改web.xml文件 (4).新建login.jsp(登录页面) (5).新建success.jsp(登录成功后跳转到此) (6).创建User实体类 (7).创建LoginVo

    2024年02月15日
    浏览(37)
  • Flask 使用Flask的session来保存用户登录状态例子

    使用Python的Flask库实现的登录接口、查询金额接口和注销接口的示例。 当用户发送POST请求到 /login 接口时,代码会获取请求中的用户名和密码。如果用户名和密码匹配(在示例中是\\\'admin\\\'和\\\'admin123\\\'),则会将用户名保存在session中,并将session设置为永久有效。这意味着用户在

    2024年02月16日
    浏览(38)
  • Spring项目使用Redis限制用户登录失败的次数以及暂时锁定用户登录权限

    前两天被面试到这个问题,最初回答的不是很合理,登录次数这方面记录还一直往数据库上面想,后来感觉在数据库中加一个登录日志表,来查询一段时间内用户登录的次数,现在看来,自己还是太年轻了,做个登录限制肯定是为了防止数据库高并发,加一个表来记录登录日

    2024年02月12日
    浏览(37)
  • MariaDB 使用 root 账户管理数据库用户权限和远程登录权限设置

    MariaDB 使用 root 账户管理数据库用户权限和远程登录权限设置 作为一种流行的关系型数据库管理系统,MariaDB 提供了丰富的功能和灵活的权限控制机制。在本文中,我们将学习如何使用 root 账户来创建新用户,并为其分配特定的数据库权限和远程登录权限。 首先,我们需要使

    2024年01月23日
    浏览(38)
  • 快速实现用户认证:使用Python和Flask配合PyJWT生成与解密Token的教程及示例代码

    这段代码提供了一个使用 Python 和 Flask 结合 JWT (JSON Web Tokens) 进行用户认证的简单框架。它包括了生成 token、解码 token、检查用户状态和一个装饰器函数,用于保护需要认证的路由。下面是对代码的逐部分解释: 1. generate_token(user_id) 函数 这个函数用于为指定的用户 ID 生成一

    2024年02月22日
    浏览(41)
  • Flask Session 登录认证模块

    Flask 框架提供了强大的 Session 模块组件,为 Web 应用实现用户注册与登录系统提供了方便的机制。结合 Flask-WTF 表单组件,我们能够轻松地设计出用户友好且具备美观界面的注册和登录页面,使这一功能能够直接应用到我们的项目中。本文将深入探讨如何通过 Flask 和 Flask-WTF

    2024年02月05日
    浏览(27)
  • Django使用DRF + Simple JWT 完成小程序使用自定义用户的注册、登录和认证

    在已经配置好djangorestframework-simplejwt的前提下进行 小程序用户模型类 这里的模型类并未继承django自带的用户模型类,好处是后面小程序用户也是没法进行admin端的,缺点是可能会对django自带的权限管理有影响,如果只有小程序端的用户的话没问题,但是如果还有其它用户的话

    2024年02月10日
    浏览(33)
  • 使用SSM框架实现用户登录功能

    客户端有非空校验 登录成功,跳转到主页面 登录失败,再次跳转到登录页面 1、创建数据库 执行命令: CREATE DATABASE ssmdb CHARSET=\\\'utf8mb4\\\'; 查看新建的数据库 2、创建用户表   执行SQL命令生成新的用户表 t_user  3、添加多条用户记录表 运行SQL命令,添加4条记录   (二)创建

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包