摘要:要使用驗證,需要通過一些外部技術例如,向客戶發送包含用戶和秘密密鑰的電子郵件向客戶端提供用戶和密鑰??蛻舳藢⑹褂锰峁┑拿荑€來簽署所有請求。
驗證類型 全局驗證
要實現安全認證,只需要在Eve實例化的時候傳入驗證類即可,這樣就創建了一個全局的驗證類
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,以在某個方法上啟用或者關閉驗證
資源級驗證有時候要對某些資源進行特別的權限控制,這時候全局驗證就不太好用了
可以重寫某個資源的驗證類
people = { "authentication":MyEndpointAuth, }
其中MyEndpointAuth和上面的MybaseAuth一樣繼承自BasicAuth并且重寫了check_auth方法,可以為每一個資源設置不同的驗證方法
全局資源安全方法在setting中加入下面的內容,可以使所有資源的GET方法都是公開的
PUBLIC_METHODS = ["GET"] PUBLIC_ITEM_METHODS = ["GET"]
PUBLIC_METHODS 引用資源端點,例如/ people ,而PUBLIC_ITEM_METHODS引用像/people/
可以為資源設置public_methods,public_item_methods來設置資源的訪問控制,資源中的這兩個屬性會覆蓋全局設定,利用這一特點可以設置全部資源公開但某一資源私有
DOMAIN = { "invoices": { "public_methods": [], "public_item_methods": [], } }
這樣invoices這個資源就被隱藏了
驗證方法 使用SHA1 / HMAC進行身份驗證假設用戶名和密碼都存儲在MongoDB中,并且密碼存儲為SHA1 / HMAC哈希值,我們可以用下面的方法驗證用戶名和密碼
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驗證token驗證可以看作只有用戶名沒有密碼的驗證方式,使用Token作為驗證,Token本身必須具備足夠的強度并且有合理的失效機制
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驗證一樣,我們要事先在數據庫里存放一個token,方法類似
db.accounts.insert({toke:"86Nv0h817921c0a065c4289416f559a2d8da3010b66727"})HMAC認證
eve.auth.HMACAuth類允許自定義的類似于Amazon S3的HMAC(哈希消息認證碼)認證,這基本上是一個非常安全的定制認證方案,圍繞Authorization頭部而構建。
要使用HMAC驗證,需要通過一些外部技術(例如,向客戶發送包含用戶ID和秘密密鑰的電子郵件)向客戶端提供用戶ID和密鑰。 客戶端將使用提供的密鑰來簽署所有請求。
當客戶想要發送一個請求時,先建立完整的請求,然后使用密鑰,在整個消息體上計算一個散列(如果需要的話還可以包含一些消息頭),接下來,客戶端將計算出的散列和他的用戶ID添加到授權標頭中的消息中,下面是一個例子:
Authorization: johndoe:uCMfSzkjue+HSDygYB5aEg==
如果要實現類似的效果,可以這樣做:
1.先往mongodb中插入一條記錄,記錄userid和secret_key
2.用secret_key計算出我們需要的散列值,添加到頭中,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訪問控制 基于角色的訪問控制
在上面的內容中被故意忽略的參數allowed_roles,作用是利用角色來控制對資源的訪問,要想要預覽這效果,需要修改之前存在mongodb中的用戶名密碼,為其增加roles屬性
db.accounts.update({username:"test1"},{$set:{"roles":"admin"}})
setting中添加全局資源允許的操作角色,也可以在資源中設置覆蓋全角的ALLOWED_ROLES設定
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: # 只有角色符合才允許后續操作 lookup["roles"] = {"$in": allowed_roles} account = accounts.find_one(lookup) return account and check_password_hash(account["password"], password)
之后用test1這個角色登錄即可看到內容
用戶對資源控制這是一個僅允許資源創建者對資源進行控制的功能,需要在setting中設置AUTH_FIELD并且在資源中設置auth_field屬性,我們假設添加到字段為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創建新的people資源,再用test1去查看,會發現無法獲取到內容test2創建的內容
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41094.html
摘要:的統一認證授權是下面的一個簡單,易用的權限框架,對于單體應用來講,完全能夠極好的,快速的滿足權限的需求,所以一般在做項目的時候,都會成為開發者的首選。 Shiro的統一認證授權 Shiro是Apache下面的一個簡單,易用的Java權限框架,對于單體應用來講,Shiro完全能夠極好的,快速的滿足權限的需求,所以一般在做項目的時候,Shiro都會成為開發者的首選。 可是,如果你需要做第二...
摘要:表示對用戶資源進行操作,相當于,對所有用戶資源實例進行操作。與整合,實際上的操作都是通過過濾器來干的。將安全管理器交由工廠來進行管理。在過濾器鏈中設置靜態資源不攔截。 前言 本文主要講解的知識點有以下: Shiro授權的方式簡單介紹 與Spring整合 初始Shiro過濾器 一、Shiro授權 上一篇我們已經講解了Shiro的認證相關的知識了,現在我們來弄Shiro的授權 Shir...
摘要:為了達到很好的效果,我們使用來對的緩存進行管理配置會話管理器,對會話時間進行控制手動清空緩存由于驗證用戶名和密碼之前,一般需要驗證驗證碼的。 前言 本文主要講解的知識點有以下: Shiro授權過濾器使用 Shiro緩存 與Ehcache整合 Shiro應用->實現驗證碼功能 記住我功能 一、授權過濾器測試 我們的授權過濾器使用的是permissionsAuthorization...
摘要:框架具有輕便,開源的優點,所以本譯見構建用戶管理微服務五使用令牌和來實現身份驗證往期譯見系列文章在賬號分享中持續連載,敬請查看在往期譯見系列的文章中,我們已經建立了業務邏輯數據訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:微信提供了作為識別用戶身份的憑證,可以結合設計一套用戶身份權限認證機制。認證免疫跨站請求偽造,而認證則存在遭受的可能性。此處的是引導用戶進入授權頁面后微信服務器附加上去的,詳細方法見微信公眾平臺的微信授權網頁文檔。 項目背景 最近在開發一個微信公眾號商城,在調用下單、支付、查詢訂單等等接口時,需要驗證用戶的身份。微信提供了openid作為識別用戶身份的憑證,可以結合openid設計一套...
閱讀 3055·2021-11-22 15:29
閱讀 1733·2021-10-12 10:11
閱讀 1768·2021-09-04 16:45
閱讀 2250·2021-08-25 09:39
閱讀 2797·2021-08-18 10:20
閱讀 2519·2021-08-11 11:17
閱讀 453·2019-08-30 12:49
閱讀 3316·2019-08-30 12:49