亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

edagarli / 438人閱讀

摘要:要使用驗(yàn)證,需要通過一些外部技術(shù)例如,向客戶發(fā)送包含用戶和秘密密鑰的電子郵件向客戶端提供用戶和密鑰??蛻舳藢⑹褂锰峁┑拿荑€來簽署所有請求。

驗(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)

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

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

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

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

資源級驗(yàn)證

有時(shí)候要對某些資源進(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è)屬性會覆蓋全局設(shè)定,利用這一特點(diǎn)可以設(shè)置全部資源公開但某一資源私有

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

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

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

假設(shè)用戶名和密碼都存儲在MongoDB中,并且密碼存儲為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)

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

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

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

之后測試登錄即可

使用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和密鑰。 客戶端將使用提供的密鑰來簽署所有請求。
當(dāng)客戶想要發(fā)送一個(gè)請求時(shí),先建立完整的請求,然后使用密鑰,在整個(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,作用是利用角色來控制對資源的訪問,要想要預(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)容

用戶對資源控制

這是一個(gè)僅允許資源創(chuàng)建者對資源進(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去查看,會發(fā)現(xiàn)無法獲取到內(nèi)容test2創(chuàng)建的內(nèi)容

    

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/41094.html

相關(guān)文章

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

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

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

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

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

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

    K_B_Z 評論0 收藏0
  • Spring Security

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

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

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

    3fuyu 評論0 收藏0

發(fā)表評論

0條評論

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