摘要:要使用驗(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/
可以為資源設(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
摘要:的統(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ā)者的首選。 可是,如果你需要做第二...
摘要:表示對用戶資源進(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...
摘要:為了達(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...
摘要:框架具有輕便,開源的優(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的搭建...
摘要:微信提供了作為識別用戶身份的憑證,可以結(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ì)一套...
閱讀 3169·2021-11-22 15:29
閱讀 1830·2021-10-12 10:11
閱讀 1889·2021-09-04 16:45
閱讀 2440·2021-08-25 09:39
閱讀 2856·2021-08-18 10:20
閱讀 2614·2021-08-11 11:17
閱讀 508·2019-08-30 12:49
閱讀 3389·2019-08-30 12:49