亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

使用python/flask實現鑒權

標簽:
Python

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

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

  • token是否合法,token是否过期、是否被篡改,token内的信息是否有效

  • 用户是否有权限执行此请求

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

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

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

怎么实现

这需要一个带参数的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



作者:茶客furu声
链接:https://www.jianshu.com/p/5b1f69efefdf


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消