摘要:要使用驗(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/
可以為資源設(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
摘要:的統(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ā)者的首選。 可是,如果你需要做第二...
摘要:表示對(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...
摘要:為了達(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...
摘要:框架具有輕便,開源的優(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的搭建...
摘要:微信提供了作為識(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ì)一套...
閱讀 3061·2021-11-22 15:29
閱讀 1746·2021-10-12 10:11
閱讀 1786·2021-09-04 16:45
閱讀 2265·2021-08-25 09:39
閱讀 2804·2021-08-18 10:20
閱讀 2532·2021-08-11 11:17
閱讀 458·2019-08-30 12:49
閱讀 3325·2019-08-30 12:49