成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python-eve 認(rèn)證和授權(quán)

edagarli / 392人閱讀

摘要:要使用驗(yàn)證,需要通過一些外部技術(shù)例如,向客戶發(fā)送包含用戶和秘密密鑰的電子郵件向客戶端提供用戶和密鑰。客戶端將使用提供的密鑰來簽署所有請(qǐng)求。

驗(yàn)證類型 全局驗(yàn)證

要實(shí)現(xiàn)安全認(rèn)證,只需要在Eve實(shí)例化的時(shí)候傳入驗(yàn)證類即可,這樣就創(chuàng)建了一個(gè)全局的驗(yàn)證類

    from eve.auth import BasicAuth
    class MybasicAuth(BasicAuth):
        def check_auth(self, username, password, allowed_roles, resource, method):
            return username == "admin" and password == "admin"
                
    app = Eve(auth=MybasicAuth)

只有用戶名和密碼滿足條件才允許訪問

如果要做到對(duì)某一資源公開,其他資源安全,可以用下面的寫法

    if resource in ("people","countries"):
        return True
    else:
        return username == "admin" and password == "secret"

同樣,你可以控制method,以在某個(gè)方法上啟用或者關(guān)閉驗(yàn)證

資源級(jí)驗(yàn)證

有時(shí)候要對(duì)某些資源進(jìn)行特別的權(quán)限控制,這時(shí)候全局驗(yàn)證就不太好用了
可以重寫某個(gè)資源的驗(yàn)證類

    people = {
        "authentication":MyEndpointAuth,
    }

其中MyEndpointAuth和上面的MybaseAuth一樣繼承自BasicAuth并且重寫了check_auth方法,可以為每一個(gè)資源設(shè)置不同的驗(yàn)證方法

全局資源安全方法

在setting中加入下面的內(nèi)容,可以使所有資源的GET方法都是公開的

    PUBLIC_METHODS = ["GET"]
    PUBLIC_ITEM_METHODS = ["GET"]

PUBLIC_METHODS 引用資源端點(diǎn),例如/ people ,而PUBLIC_ITEM_METHODS引用像/people/這樣的單個(gè)項(xiàng)目。

自定義資源安全方法

可以為資源設(shè)置public_methods,public_item_methods來設(shè)置資源的訪問控制,資源中的這兩個(gè)屬性會(huì)覆蓋全局設(shè)定,利用這一特點(diǎn)可以設(shè)置全部資源公開但某一資源私有

    DOMAIN = {
        "invoices": {
            "public_methods": [],
            "public_item_methods": [],
             }
        }

這樣invoices這個(gè)資源就被隱藏了

驗(yàn)證方法 使用SHA1 / HMAC進(jìn)行身份驗(yàn)證

假設(shè)用戶名和密碼都存儲(chǔ)在MongoDB中,并且密碼存儲(chǔ)為SHA1 / HMAC哈希值,我們可以用下面的方法驗(yàn)證用戶名和密碼

    from eve.auth import BasicAuth
    from werkzeug.security import check_password_hash
    from flask import current_app as app
        
    class Sha1Auth(BasicAuth):
        def check_auth(self, username, password, allowed_roles, resource, method):
            # use Eve"s own db driver; no additional connections/resources are used
            accounts = app.data.driver.db["accounts"]
            account = accounts.find_one({"username": username})
            return account and 
                check_password_hash(account["password"], password)

為了要測(cè)試用戶名和密碼,我們要事先往mongodb的accounts表中插入一條記錄

    use eve
    db.createCollection("accounts")
    db.accounts.insert({username:"test1",passowrd:"pbkdf2:sha1:1000$v86Nv0hS$817921c0a065c4289416f559a2d8da3010b66727"})

密碼為admin
tips:更新密碼請(qǐng)用db.accounts.update({"username":"test1"},{$set:{"password":"new password"}})

之后測(cè)試登錄即可

使用TOKEN驗(yàn)證

token驗(yàn)證可以看作只有用戶名沒有密碼的驗(yàn)證方式,使用Token作為驗(yàn)證,Token本身必須具備足夠的強(qiáng)度并且有合理的失效機(jī)制

    class TokenAuthS(TokenAuth):
        def check_auth(self, token, allowed_roles, resource, method):
            accounts = app.data.driver.db["accounts"]
            return accounts.find_one({"token": token})

和SHA1/HMAC驗(yàn)證一樣,我們要事先在數(shù)據(jù)庫里存放一個(gè)token,方法類似

    db.accounts.insert({toke:"86Nv0h817921c0a065c4289416f559a2d8da3010b66727"})
    
HMAC認(rèn)證

eve.auth.HMACAuth類允許自定義的類似于Amazon S3的HMAC(哈希消息認(rèn)證碼)認(rèn)證,這基本上是一個(gè)非常安全的定制認(rèn)證方案,圍繞Authorization頭部而構(gòu)建。

要使用HMAC驗(yàn)證,需要通過一些外部技術(shù)(例如,向客戶發(fā)送包含用戶ID和秘密密鑰的電子郵件)向客戶端提供用戶ID和密鑰。 客戶端將使用提供的密鑰來簽署所有請(qǐng)求。
當(dāng)客戶想要發(fā)送一個(gè)請(qǐng)求時(shí),先建立完整的請(qǐng)求,然后使用密鑰,在整個(gè)消息體上計(jì)算一個(gè)散列(如果需要的話還可以包含一些消息頭),接下來,客戶端將計(jì)算出的散列和他的用戶ID添加到授權(quán)標(biāo)頭中的消息中,下面是一個(gè)例子:

        Authorization: johndoe:uCMfSzkjue+HSDygYB5aEg==

如果要實(shí)現(xiàn)類似的效果,可以這樣做:
1.先往mongodb中插入一條記錄,記錄userid和secret_key
2.用secret_key計(jì)算出我們需要的散列值,添加到頭中,eve中寫法如下

    class HMACAuths(HMACAuth):
        def check_auth(self, userid, hmac_hash, headers, data, allowed_roles,
                           resource, method):
            accounts = app.data.driver.db["accounts"]
            user = accounts.find_one({"userid": userid})
            if user:
                secret_key = user["secret_key"]
            return user and hmac.new(bytes(secret_key.encode()), data, sha1).hexdigest() == hmac_hash
訪問控制 基于角色的訪問控制

在上面的內(nèi)容中被故意忽略的參數(shù)allowed_roles,作用是利用角色來控制對(duì)資源的訪問,要想要預(yù)覽這效果,需要修改之前存在mongodb中的用戶名密碼,為其增加roles屬性

    db.accounts.update({username:"test1"},{$set:{"roles":"admin"}})

setting中添加全局資源允許的操作角色,也可以在資源中設(shè)置覆蓋全角的ALLOWED_ROLES設(shè)定

ALLOWED_ROLES = ["superadmin","admin"]

之后修改check_auth方法

    def check_auth(self, username, password, allowed_roles, resource, method):
        accounts = app.data.driver.db["accounts"]
        lookup = {"username": username}
        if allowed_roles:
            # 只有角色符合才允許后續(xù)操作 
            lookup["roles"] = {"$in": allowed_roles}
        account = accounts.find_one(lookup)
        return account and check_password_hash(account["password"], password)

之后用test1這個(gè)角色登錄即可看到內(nèi)容

用戶對(duì)資源控制

這是一個(gè)僅允許資源創(chuàng)建者對(duì)資源進(jìn)行控制的功能,需要在setting中設(shè)置AUTH_FIELD并且在資源中設(shè)置auth_field屬性,我們假設(shè)添加到字段為user_id
1.首先setting.py中添加 AUTH_FIELD = []
2.然后people中添加"auth_field":"user_id"
3.最后將check_auth方法修改為

    def check_auth(self, username, password, allowed_roles, resource, method):
        accounts = app.data.driver.db["accounts"]
        account = accounts.find_one({"username": username})
        if account and "_id" in account:
            self.set_request_auth_value(account["_id"])
        return account and check_password_hash(account["password"], password)
    之后我們插入新的用戶test2,用test2創(chuàng)建新的people資源,再用test1去查看,會(huì)發(fā)現(xiàn)無法獲取到內(nèi)容test2創(chuàng)建的內(nèi)容

    

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41094.html

相關(guān)文章

  • Shiro的統(tǒng)一認(rèn)證授權(quán)

    摘要:的統(tǒng)一認(rèn)證授權(quán)是下面的一個(gè)簡(jiǎn)單,易用的權(quán)限框架,對(duì)于單體應(yīng)用來講,完全能夠極好的,快速的滿足權(quán)限的需求,所以一般在做項(xiàng)目的時(shí)候,都會(huì)成為開發(fā)者的首選。 Shiro的統(tǒng)一認(rèn)證授權(quán) Shiro是Apache下面的一個(gè)簡(jiǎn)單,易用的Java權(quán)限框架,對(duì)于單體應(yīng)用來講,Shiro完全能夠極好的,快速的滿足權(quán)限的需求,所以一般在做項(xiàng)目的時(shí)候,Shiro都會(huì)成為開發(fā)者的首選。 可是,如果你需要做第二...

    cocopeak 評(píng)論0 收藏0
  • Shiro【授權(quán)、整合Spirng、Shiro過濾器】

    摘要:表示對(duì)用戶資源進(jìn)行操作,相當(dāng)于,對(duì)所有用戶資源實(shí)例進(jìn)行操作。與整合,實(shí)際上的操作都是通過過濾器來干的。將安全管理器交由工廠來進(jìn)行管理。在過濾器鏈中設(shè)置靜態(tài)資源不攔截。 前言 本文主要講解的知識(shí)點(diǎn)有以下: Shiro授權(quán)的方式簡(jiǎn)單介紹 與Spring整合 初始Shiro過濾器 一、Shiro授權(quán) 上一篇我們已經(jīng)講解了Shiro的認(rèn)證相關(guān)的知識(shí)了,現(xiàn)在我們來弄Shiro的授權(quán) Shir...

    ralap 評(píng)論0 收藏0
  • Shiro【授權(quán)過濾器、與ehcache整合、驗(yàn)證碼、記住我】

    摘要:為了達(dá)到很好的效果,我們使用來對(duì)的緩存進(jìn)行管理配置會(huì)話管理器,對(duì)會(huì)話時(shí)間進(jìn)行控制手動(dòng)清空緩存由于驗(yàn)證用戶名和密碼之前,一般需要驗(yàn)證驗(yàn)證碼的。 前言 本文主要講解的知識(shí)點(diǎn)有以下: Shiro授權(quán)過濾器使用 Shiro緩存 與Ehcache整合 Shiro應(yīng)用->實(shí)現(xiàn)驗(yàn)證碼功能 記住我功能 一、授權(quán)過濾器測(cè)試 我們的授權(quán)過濾器使用的是permissionsAuthorization...

    K_B_Z 評(píng)論0 收藏0
  • Spring Security

    摘要:框架具有輕便,開源的優(yōu)點(diǎn),所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實(shí)現(xiàn)身份驗(yàn)證往期譯見系列文章在賬號(hào)分享中持續(xù)連載,敬請(qǐng)查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對(duì)身份進(jìn)行驗(yàn)證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 評(píng)論0 收藏0
  • 基于token的用戶權(quán)限認(rèn)證機(jī)制——以微信公眾號(hào)授權(quán)網(wǎng)頁為例

    摘要:微信提供了作為識(shí)別用戶身份的憑證,可以結(jié)合設(shè)計(jì)一套用戶身份權(quán)限認(rèn)證機(jī)制。認(rèn)證免疫跨站請(qǐng)求偽造,而認(rèn)證則存在遭受的可能性。此處的是引導(dǎo)用戶進(jìn)入授權(quán)頁面后微信服務(wù)器附加上去的,詳細(xì)方法見微信公眾平臺(tái)的微信授權(quán)網(wǎng)頁文檔。 項(xiàng)目背景 最近在開發(fā)一個(gè)微信公眾號(hào)商城,在調(diào)用下單、支付、查詢訂單等等接口時(shí),需要驗(yàn)證用戶的身份。微信提供了openid作為識(shí)別用戶身份的憑證,可以結(jié)合openid設(shè)計(jì)一套...

    3fuyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<