使用python/flask实现鉴权

作者: 茶客furu声 | 来源:发表于2016-07-13 10:45 被阅读1495次

上一篇文章介绍了使用JWT协议来做token认证的功能,继续装逼下去,怎样实现一个鉴权的模块?

假设token认证的功能已经完成,那么设定为每次请求头部中都带上这个token。server端在每次响应请求时都要做一次token的校验,包括两个内容:

  • token是否合法,token是否过期、是否被篡改,token内的信息是否有效
  • 用户是否有权限执行此请求

在python/flash上,这个检验使用decorator实现,会是一个很靠谱的办法,代码简洁性和可读性都很不错。

为认证和鉴权创建数据模型

首先,理清关系,用户-角色-权限,是多对多对多的关系。通过flask-sqlalchemy给这三者创建多对多模型,会是五张表,其中有两张表是多对多连接用的实体表,无ORM模型(根据flask的建议)。

然后,为了实现审计功能(一些删除对象操作之后将造成历史数据无法对应),用户-角色-权限都需要添加valid字段。删除时只设为不可用。

最后,创建一个decorator函数,实现检查token并审核权限的功能。

目标效果是怎样的?

在一个api或函数前,添加此decorator,参数包含它所需要的权限名称。一旦请求执行到此函数,将执行decorator的权限检查。如果认证或鉴权失败,直接走异常处理流程,不会执行请求内容。类似这样:

@auth.PrivilegeAuth(privilegeRequired="userAdmin")
    def get(self):
        """
        get user list or one user info ...
        """

怎么实现

这需要一个带参数的decorator类,需要传参。内部逻辑十分简单,检查token--检查用户--检查角色--检查权限匹配--搞定放行。

ps.抱歉我的英文十分chinglish哈哈。。

auth.py

class PrivilegeAuth(Resource):
    """
    This class is used tobe a decoretor for other methods to check the
    client's privilege by token.
    Your method's 'required privilege' should be set as an argument of this
    decoretor. And this 'required privilege' should have been in the
    'privilege' table.
    If your method's 'required privilege' is one of user's privileges,
    user will be allowed to access the method, otherwise not.
    ps. user's privilege is checked by his token.
    """
    def __init__(self, privilegeRequired):
        # argument 'privilegeRequired' is to set up your method's privilege
        # name
        self.privilegeRequired = privilegeRequired
        super(PrivilegeAuth, self).__init__()

    def __call__(self, fn):
        def wrapped(*args, **kwargs):
            try:
                rolesReq = Privilege.getFromPrivilegeName(
                    self.privilegeRequired).roles
            except:
                msg = 'wrong privilege setting: privilege (' +\
                    self.privilegeRequired + ') doesnot set in any roles'
                app.logger.error(utils.logmsg(msg))
                raise utils.InvalidModuleUsage('wrong privilege setting')

            # get user's privileges by his token
            # if token is in body, then:
            # myreqparse = reqparse.RequestParser()
            # myreqparse.add_argument('token')
            # args = myreqparse.parse_args()
            # if token is in headers, then:
            token = request.headers.get('token')
            if not token:
                msg = "you need a token to access"
                raise utils.InvalidAPIUsage(msg)
            [userId, roleIdList, msg] = User.tokenAuth(token)
            if not userId:
                msg = msg + " when autherization"
                raise utils.InvalidAPIUsage(msg)
            else:
                currentUser = User.getValidUser(userId=userId)
                if not currentUser:
                    msg = "cannot find user when autherization"
                    raise utils.InvalidAPIUsage(msg)

            # user's privilege auth
            for role in currentUser.roles:
                for roleReq in rolesReq:
                    if role.role_id == roleReq.role_id:
                        return fn(*args, **kwargs)

            msg = "Privilege not Allowed."
            app.logger.info(utils.logmsg(msg))
            raise utils.InvalidAPIUsage(msg)
        return wrapped

相关文章

  • 使用python/flask实现鉴权

    上一篇文章介绍了使用JWT协议来做token认证的功能,继续装逼下去,怎样实现一个鉴权的模块? 假设token认证...

  • 谈谈鉴权与授权

    目录 鉴权场景实现 授权场景实现 鉴权 鉴权(authentication): 你是谁 场景 实现 关于鉴权的示例...

  • Flask web开发第五章数据库

    5.11 使用Flask-Migrate实现数据库迁移 环境: Mac python:3.7 跟着Flask w...

  • Python学习

    python-flask框架学习(一) Flask是由python实现的一个web微框架,让我们可以使用Pytho...

  • Flask

    flask使用操作指南1 1. flask介绍 Flask是一个基于Python实现的web开发的'微'框架 中文...

  • Flask——入门基础

    一:Flask概述 flask是使用python语言编写的一个轻量级的web框架,内部wsgi实现采用werkze...

  • Flask入门

    1. Flask概述 Flask是使用python语言编写的一个轻量级的web框架内部WSGI实现采用Werkz...

  • 鉴权token和refresh_token

    每次访问鉴权使用token,token使用aes对称加密,鉴权时直接解密得到uid,无需访问数据库验证,鉴权tok...

  • pythonFlask框架学习

    Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。而且...

  • 04-15动态路由的实现与优化

    Vue中后台鉴权的另一种思路 - 动态路由的实现与优化 鉴权-前端路由 VS 鉴权-动态路由 前端路由鉴权相信只要...

网友评论

    本文标题:使用python/flask实现鉴权

    本文链接:https://www.haomeiwen.com/subject/tgvsjttx.html